Spring Boot项目war包部署Tomcat Docker容器所有请求返回404如何解决
问题原因与解决方案
1. 修正错误的web.xml配置
你将Tomcat默认web.xml中default servlet的url-pattern修改为/*是核心错误配置:
- default servlet的作用是处理静态资源请求,
/*的优先级高于Spring MVC的DispatcherServlet,会拦截所有业务请求,根本不会流转到你的Spring Boot应用 - 解决方案:将该配置改回默认值
<url-pattern>/</url-pattern>,或直接删除你本地修改的web.xml,使用Tomcat镜像自带的默认配置,启动容器时去掉-v /Users/sachintiwari/Desktop/web.xml:/usr/local/tomcat/conf/web.xml挂载参数。
2. 确认访问路径匹配上下文路径
Tomcat会自动将webapps目录下的war包解压为与war包同名的上下文目录,比如你的war包名为demo.war,则所有请求需要加上上下文路径前缀/demo,例如:
错误访问路径:
http://localhost:8080/api/xxx
正确访问路径:http://localhost:8080/demo/api/xxx
如果需要根路径直接访问,在Dockerfile中COPY war包时重命名为ROOT.war即可:
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
3. 修正Tomcat版本兼容性问题
你使用的Spring Boot 2.2.1.RELEASE默认适配Servlet 4.0规范,而tomcat:8镜像最高支持Servlet 3.1,存在版本兼容风险,建议将基础镜像替换为适配Java 8的Tomcat 9版本:
FROM tomcat:9-jre8
4. 排查应用启动异常
进入运行中的容器检查日志确认Spring Boot是否正常启动:
- 执行
docker ps获取容器ID - 进入容器查看启动日志:
docker exec -it [容器ID] cat /usr/local/tomcat/logs/catalina.out - 检查是否存在Spring Boot启动报错(比如数据源连接失败、配置项缺失等),如果应用启动失败自然所有请求返回404。
5. 确认配置项一致
检查你local环境的配置文件中是否配置了server.servlet.context-path,如果有自定义上下文路径,访问请求需要加上对应前缀。
内容的提问来源于stack exchange,提问作者Sachin Tiwari
相关产品推荐
相关产品推荐

