使用Docker运行Spring Boot War文件时遭遇404错误求助
解决Spring Boot War包在Tomcat Docker容器中404的问题
1. 调整Spring Boot项目适配外部Tomcat
Spring Boot默认用嵌入式容器,要部署到外部Tomcat必须修改启动类:
- 让启动类继承
SpringBootServletInitializer - 重写
configure方法指定应用入口
代码示例:
@SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(DemoApplication.class); } }
同时推荐在pom.xml中把嵌入式Tomcat依赖设为provided,避免和外部Tomcat冲突:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
2. 正确打包War包
执行打包命令生成符合外部Tomcat要求的War包:
mvn clean package -DskipTests
确认target目录下生成的test.war结构完整(包含WEB-INF目录)。
3. 优化Docker配置与容器运行
选项一:保留原包名,通过上下文路径访问
Dockerfile可保持原有内容,但要注意访问路径的变化:
FROM tomcat:9.0.85-jdk17-temurin-jammy EXPOSE 8080 COPY target/test.war /usr/local/tomcat/webapps/test.war CMD ["catalina.sh", "run"]
构建命令不变:
docker build --no-cache -t test .
运行容器时映射端口:
docker run -d -p 8080:8080 test
此时访问路径需加上War包名作为上下文,比如Hello World接口为/hello,则访问http://localhost:8080/test/hello。
选项二:重命名为ROOT.war,使用根路径访问
如果想和本地Spring Boot运行的路径一致,修改Dockerfile将War包重命名为ROOT.war,Tomcat会将其作为根应用:
FROM tomcat:9.0.85-jdk17-temurin-jammy EXPOSE 8080 COPY target/test.war /usr/local/tomcat/webapps/ROOT.war CMD ["catalina.sh", "run"]
构建运行后,直接访问http://localhost:8080/[你的接口路径]即可。
4. 排查验证
- 查看容器日志确认部署状态:
docker logs [容器ID]
如果看到Deploying web application archive [/usr/local/tomcat/webapps/test.war]且无报错,说明部署成功。
- 进入容器检查War包解压情况:
docker exec -it [容器ID] bash ls /usr/local/tomcat/webapps/
正常情况下能看到和War包同名的解压目录(如test)。
内容的提问来源于stack exchange,提问作者Aakash
相关产品推荐
相关产品推荐

