You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"]

验证步骤

  1. 重新构建镜像:
    docker build -t tomcat:0.2 .
    
  2. 启动容器:
    docker run tomcat:0.2
    

此时会看到Tomcat的启动日志持续输出,容器不会自动停止;Kubernetes环境中Pod也会保持Running状态。

内容的提问来源于stack exchange,提问作者Bhabani Shankar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:07:03