我运行启动 tomcat8 服务器的 docker 映像,但它没有启动

Posted

技术标签:

【中文标题】我运行启动 tomcat8 服务器的 docker 映像,但它没有启动【英文标题】:I run the docker images which start tomcat8 server but it don't start 【发布时间】:2017-11-18 18:59:12 【问题描述】:

我有从我的 docker 文件创建的 docker 映像。当我运行映像时,它能够运行 tomcat 服务器,然后命令提示符返回。这意味着该过程已终止,我认为容器已停止。所以当我看到http://localhost:8080 时没有出现tomcat 页面。所以我无法找到实际的问题。我实际上正在尝试构建自定义 java8、tomcat8 和 maven 作为环境,我想在那个 tomcat 服务器中部署我的 maven 项目。 Bellow 是创建镜像的 Dockerfile

FROM scratch
FROM ubuntu:16.04

RUN mkdir /opt/java8
RUN mkdir /opt/tomcat8
RUN mkdir /opt/maven3

ENV JAVA_HOME /opt/java8
ENV CATALINA_HOME /opt/tomcat8
ENV M2_HOME /opt/maven3

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$M2_HOME/bin

ADD jdk1.8.0_112 /opt/java8
ADD apache-tomcat-8.0.38 /opt/tomcat8
ADD apache-maven-3.3.9 /opt/maven3

EXPOSE 8080

CMD ["startup.sh", "run"]

我把 java、tomcat、maven 的 3 个文件夹放在 Docker 文件附近,所以这些都被添加了。

现在,当我构建映像并运行映像时,会出现以下日志。

root@dhavalbhoot:/home/veni/Documents/dhaval_bhoot/docker_images/tomcat1#
  docker run -it -p 8080:8080 dhaval/tomcat:8.0.38

输出:

Using CATALINA_BASE:   /opt/tomcat8
Using CATALINA_HOME:   /opt/tomcat8
Using CATALINA_TMPDIR: /opt/tomcat8/temp
Using JRE_HOME:        /opt/java8
Using CLASSPATH:       
  \#/opt/tomcat8/bin/bootstrap.jar:/opt/tomcat8/bin/tomcat-juli.jar
Tomcat started.

root@dhavalbhoot:/home/veni/Documents/dhaval_bhoot/docker_images/tomcat1#

这样提示回来了,我在浏览器中检查http://localhost:8080 没有出现tomcat页面 所以帮我解决问题。

【问题讨论】:

我很困惑:为什么让你的问题的格式变得更糟?我已经正确格式化了 docker run 的输出。 我可以恢复正确的格式吗?这将使您的问题更具可读性。 我已经恢复了格式,只是为了让你明白我的意思:如果你不喜欢它,你可以撤消我的编辑。 【参考方案1】:

类似的docker official tomcat image (8.0.40) 运行:

CMD ["catalina.sh", "run"]

使用catalina.sh made to start tomcat in the foreground:进程不会立即退出。 如果您的 tomcat 安装确实包含该脚本,您应该使用它或startup.sh

或者直接运行一个tomcat镜像进行测试:

$ docker run -it --rm -p 8080:8080 tomcat:8.0

您可以在浏览器中访问http://container-ip:8080进行测试

【讨论】:

@DhavalBhoot 我怀疑你有/opt/java8/jdk1.8.0_112/bin/java 而不是直接/opt/java8/bin/java。与其从SCRATCHUbuntu 开始,不如从tomcat:8.0 开始你的图像?这样,您无需添加任何内容:正确的 java 已经存在。 添加 CMD ["catalina.sh", "run"] 代替 CMD ["startup.sh", "run"] 解决问题,进程不会退出。现在你能帮我在后台运行这个过程吗?以及如何使用他们官方网站上的 tar.gz 安装所有这 3 个东西? @DhavalBhoot 哪三件事?如果您的图像是从 tomcat 开始的,那么它已经有 tomcat 和 java。 现在我使用文件夹添加了 3 个东西 java、tomcat 和 maven,这意味着我已将这 3 个文件夹放在我的 Dockerfile 旁边并编写 ADD 命令将它们添加到图像中。现在我想从这些软件的网站上以 tar.gz 的形式获取它们。我使用“从头开始”,因为我想将其创建为基础映像,然后我将创建另一个 Dockerfile,在其中我提供上一个具有 java、tomcat 和 maven 的映像的参考,并放在我的项目代码旁边.然后我在图像中添加这些代码并想运行“mvn tomcat:deploy”命令,它将在 tomcat 中部署代码。 @DhavalBhoot 您正在运行哪个 docker 版本?您所描述的看起来像是一个多阶段构建,使用 Docker 17.05(意味着使用最新版本的 Docker,您不再需要 2 个 Dockerfile:您可以使用 2 个“FROM”图像使用一个 Dockerfile 完成所有操作:在docs.docker.com/engine/userguide/eng-image/multistage-build 阅读更多内容。

以上是关于我运行启动 tomcat8 服务器的 docker 映像,但它没有启动的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat8无法在Windows Host上的VirtualBox Vagrant中以Ubuntu 16.04启动

Linux 部署Tomcat8

Linux 部署Tomcat8

OperationCenter Docker容器启动脚本

docker基于centos构建jdk8+tomcat8镜像

docker基于centos构建jdk8+tomcat8镜像