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

自定义Tomcat Docker容器启动后自动停止问题求助

嘿,这个坑我当初学Docker的时候也踩过!明明日志显示Tomcat启动成功,但容器刚跑起来就自动停止,其实核心原因和Docker的运行逻辑有关——Docker容器必须有一个持续运行的前台进程才能保持存活,而默认的Tomcat启动脚本是把它放到后台跑的,这就导致容器的主进程执行完启动命令就直接退出了,容器自然跟着停掉,哪怕Tomcat在后台真的启动了也没用。

核心问题拆解

你大概率是在Dockerfile里用了catalina.sh start命令启动Tomcat,这个命令的作用是把Tomcat作为后台守护进程启动,执行完这个命令的shell进程就会结束,Docker发现主进程没了,就会直接终止容器。

解决方案:让Tomcat前台运行

只需要把启动命令改成catalina.sh run就能让Tomcat在前台运行,成为容器的主进程,这样容器就会一直保持运行状态。下面给你一个完整的、可以直接参考的Dockerfile示例:

# 选一个和Tomcat版本匹配的JDK基础镜像,这里用OpenJDK 11搭配Tomcat 9
FROM openjdk:11-jre-slim

# 设置容器内的工作目录
WORKDIR /opt/tomcat

# 下载、解压Tomcat(你可以换成自己需要的Tomcat版本号)
RUN apt-get update && apt-get install -y wget \
    && wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.80/bin/apache-tomcat-9.0.80.tar.gz \
    && tar -xzf apache-tomcat-9.0.80.tar.gz --strip-components=1 \
    && rm apache-tomcat-9.0.80.tar.gz \
    && apt-get remove -y wget && apt-get clean && rm -rf /var/lib/apt/lists/*

# 暴露Tomcat的默认服务端口
EXPOSE 8080

# 关键:用catalina.sh run让Tomcat前台运行,这会成为容器的主进程
CMD ["catalina.sh", "run"]
额外小贴士
  • 如果你的Dockerfile里用了ENTRYPOINT而不是CMD,可以这么写来保证前台运行:
    ENTRYPOINT ["catalina.sh"]
    CMD ["run"]
    
  • 构建镜像时记得加个标签方便管理:docker build -t my-custom-tomcat .
  • 运行容器的时候用docker run -d -p 8080:8080 my-custom-tomcat,之后你就能通过浏览器访问localhost:8080验证Tomcat是否正常工作啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:41:49