Docker容器中Tomcat启动后自动停止问题求助
自定义Tomcat容器启动后立即停止问题解决
问题描述
基于Amazon Corretto 21.0.4-al2镜像构建自定义Tomcat镜像,镜像构建正常,但启动容器时仅输出Tomcat started.后容器随即停止;Kubernetes环境中Pod显示已完成并持续重启。但以交互模式进入容器后,手动执行startup.sh可正常启动Tomcat。
容器启动输出
sudo docker run tomcat:0.1 Tomcat started.
交互模式启动输出
sudo docker run --rm -it --entrypoint bash tomcat:0.1 bash-4.2# cd /usr/local/tomcat/bin/ bash-4.2# ./startup.sh Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/lib/jvm/java-21-amazon-corretto Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Using CATALINA_OPTS: Tomcat started.
Dockerfile内容
FROM amazoncorretto:21.0.4-al2 #CMD ["/bin/bash"] USER root COPY tomcat /usr/local/tomcat ENV CATALINA_HOME=/usr/local/tomcat ENV PATH=/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin EXPOSE 8080 WORKDIR /usr/local/tomcat/bin CMD ["/usr/local/tomcat/bin/startup.sh", "run"] #ENTRYPOINT ["/bin/sh", "-c", "/usr/local/tomcat/bin/startup.sh"] #CMD ["/usr/local/tomcat/bin/catalina.sh" "run"]
原因分析
Tomcat的startup.sh脚本默认是后台启动Tomcat进程,脚本执行完成后会自行退出。而Docker容器的生命周期完全依赖主进程:一旦主进程退出,容器就会停止运行。
交互模式下手动执行startup.sh时,终端会话保持活跃,Tomcat后台进程可以持续运行;但直接将startup.sh设为容器CMD时,脚本启动Tomcat后立即退出,导致容器主进程结束,容器随之停止。
解决方案
修改Dockerfile中的CMD指令,改用catalina.sh run命令启动Tomcat——该命令会前台运行Tomcat进程,确保容器主进程持续存活,避免容器意外停止。
修改后的Dockerfile关键行:
CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
验证步骤
- 重新构建镜像:
docker build -t tomcat:0.2 . - 启动容器:
docker run tomcat:0.2
此时会看到Tomcat的启动日志持续输出,容器不会自动停止;Kubernetes环境中Pod也会保持Running状态。
内容的提问来源于stack exchange,提问作者Bhabani Shankar
相关产品推荐
相关产品推荐

