我正在尝试在 Docker 容器内运行 Tomcat 实例。出于安全原因,我不使用 Tomcat Docker 映像。相反,我尝试使用 Amazon JDK 并将 Tomcat 目录复制到 /usr/local 路径。映像构建良好。但是,它只是运行 Tomcat 实例。启动容器时,它只是显示Tomcat 已启动。然后什么都没有。
当您启动容器时,下面是我所看到的内容,然后容器停止。
sudo docker run tomcat:0.1
Tomcat started.
当我在 Kubernetes 中尝试相同的设置时,它显示 pod 已完成并继续重新启动。此外,当我以交互模式进入容器时,我可以启动 Tomcat,并且一切运行正常,如下所示:
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.
我的docker文件如下:
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"]
PS-没有权限问题,因为我已经将整个 tomcat 目录设为 777
构建自己的映像似乎不太可能更安全,但无论如何,您都应该检查官方 tomcat 映像以了解如何在容器环境中正确启动 tomcat。
您的问题是您正在使用
startup.sh
,它会在后台启动 tomcat。这会导致 Docker 认为您的容器已完成运行。如果你看
Dockerfile
一下官方图片,你会看到他们通过以下方式启动 tomcat:通过这种方式启动,tomcat 将在前台运行(输出到 stdout/stderr)。Dockerfile 的工作版本应为: