自定义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
相关产品推荐
相关产品推荐

