Docker容器化的Spring Boot应用API内外均返回404无法访问求助
排查与解决方案
1. 优先确认镜像是否为最新版本
代码更新后必须重新构建镜像,否则容器运行的仍是无对应接口的旧版本镜像,执行以下命令更新:
mvn clean package docker build -t spring-boot-app . docker compose up -d spring-boot-app
2. 检查Spring Boot应用启动状态与日志
执行以下命令查看容器内应用运行日志:
docker logs spring-boot-app
重点核查两个点:
- 应用是否正常启动完成,无报错、无异常退出
- 日志中是否存在对应接口的映射记录,类似
Mapped "{[/kafka/health-check],methods=[GET]}",如果没有该记录说明接口未被Spring容器注册- 若未注册:首先修改Controller类名,避免类名与
@RestController注解同名导致的扫描异常,其次确认Spring Boot启动类位于Controller所在包的上级目录,保证组件扫描能覆盖到Controller类 - 若已注册:检查
application.yml/application.properties中是否配置了server.servlet.context-path上下文路径,如果配置了前缀,访问路径需要加上对应前缀,例如配置server.servlet.context-path=/api,则接口完整路径为http://localhost:8080/api/kafka/health-check
- 若未注册:首先修改Controller类名,避免类名与
3. 核查应用端口配置
检查配置文件中server.port是否为8080,如果自定义了其他端口,需要同步修改Dockerfile的EXPOSE配置、Docker Compose中spring-boot-app服务的端口映射配置。
4. 核查打包配置
确认pom.xml中已配置spring-boot-maven-plugin插件,否则打出来的JAR包不是可执行的Fat Jar,会出现类扫描缺失、主类找不到等问题,插件配置参考:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
额外优化提示:后续Kafka通信可提前调整配置,将KAFKA_ADVERTISED_HOST_NAME改为kafka(Docker Compose中Kafka服务的名称),Spring Boot应用中Kafka连接地址配置为kafka:9092即可实现容器内网稳定通信。
内容的提问来源于stack exchange,提问作者Capitano Giovarco
相关产品推荐
相关产品推荐

