SpringBoot应用Docker部署后访问出现404问题求助
问题分析与缺失步骤
你遇到的404问题核心是没有正确处理SpringBoot应用的打包和Docker镜像的内容复制逻辑,具体缺失的步骤如下:
1. 未先构建SpringBoot应用的可执行产物
你当前直接将项目源码COPY到Tomcat的webapps目录,但Tomcat无法运行Java源码,必须先通过Maven/Gradle将项目编译打包成war包(适配外部Tomcat)或可执行jar包(自带内嵌Tomcat)。
2. 若坚持使用Tomcat镜像部署,需修改项目配置并打包为war包
(1)调整项目打包方式与依赖
在pom.xml中修改打包类型,并排除内嵌Tomcat依赖(避免与容器Tomcat冲突):
<!-- 修改打包方式为war --> <packaging>war</packaging> <!-- 排除内嵌Tomcat,让外部Tomcat提供运行环境 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> </dependencies>
(2)修改启动类继承SpringBootServletInitializer
让启动类适配外部Servlet容器:
@SpringBootApplication public class HelloWorldApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(HelloWorldApplication.class); } public static void main(String[] args) { SpringApplication.run(HelloWorldApplication.class, args); } }
(3)执行打包命令
运行Maven命令生成war包:
mvn clean package -DskipTests
(4)修正Dockerfile的COPY逻辑
将打包好的war包复制到Tomcat的webapps目录,建议重命名为ROOT.war(避免访问时需要加war包名称前缀):
FROM tomcat:9.0-jre17-temurin-focal WORKDIR /usr/local/tomcat/webapps # 复制target目录下的war包到当前目录,并重命名为ROOT.war COPY target/helloworld.war ./ROOT.war EXPOSE 8080 CMD ["catalina.sh", "run"]
3. 更简便的替代方案:使用JDK镜像直接运行可执行jar
SpringBoot默认自带内嵌Tomcat,无需依赖外部Tomcat镜像,这种方式更简洁:
(1)打包可执行jar
无需修改项目配置,直接运行Maven命令:
mvn clean package -DskipTests
(2)编写新的Dockerfile
FROM openjdk:17-jdk-slim WORKDIR /app # 复制打包好的jar包到容器内 COPY target/helloworld.jar app.jar EXPOSE 8080 # 运行jar包 CMD ["java", "-jar", "app.jar"]
(3)重新构建并运行镜像
docker build -t firstcode . docker run -p 8080:8080 firstcode
内容的提问来源于stack exchange,提问作者Aakash
相关产品推荐
相关产品推荐

