2017-03-24 54 views
4

我正在试验Docker,并且对它很新颖。我很长一段时间,并没有得到解决方法,因此在这里想出了这个问题...Apache Tomcat 8不在码头集装箱内启动

问题声明: 我想从包含Apache的docker文件创建一个图像,山猫安装。一旦完成,我试图访问容器的8080上的tomcat,然后将该容器转发给主机的8082。但是在运行映像时,我从来没有在容器中启动tomcat。

的泊坞文件

FROM ubuntu:16.10 
#Install Lynx 
Run apt-get update 
Run apt-get install -y lynx 

#Install Curl 
Run apt-get install -y curl 

#Install tools: jdk 
Run apt-get update 
Run apt-get install -y openjdk-8-jdk wget 

#Install apache tomcat 
Run groupadd tomcat 
Run useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat 
Run cd /tmp 
Run curl -O http://apache.mirrors.ionfish.org/tomcat/tomcat- 8/v8.5.12/bin/apache-tomcat-8.5.12.tar.gz 
Run mkdir /opt/tomcat 
Run tar xzvf apache-tomcat-8*tar.gz -C /opt/tomcat --strip-components=1 
Run cd /opt/tomcat 
Run chgrp -R tomcat /opt/tomcat 
Run chmod -R g+r /opt/tomcat/conf 
Run chmod g+x /opt/tomcat/conf 
Run chown -R tomcat /opt/tomcat/webapps /opt/tomcat/work /opt/tomcat/temp opt/tomcat/logs 

Run cd /opt/tomcat/bin 

Expose 8080 
CMD /opt/tomcat/bin/catalina.sh run && tail -f /opt/tomcat/logs/catalina.out 

当图像被内置我试图通过两个以下方法

  1. 搬运工运行运行容器-d -p 8082:8080图像标识尾-f/dev/null 虽然使用上述内容,但容器正在运行,但tomcat未在容器内启动,因此无法从localhost:8082访问。此外,我没有看到任何东西,如果我执行搬运工人日志longcontainerid

  2. 搬运工运行-d -p 8082:8080图像标识/path/to/catalina.sh开始尾-f /开发/空 我看到tomcat的开始时,我做码头日志longconatainrid 虽然使用上面的容器是立即启动和停止,并没有运行,因为我可以从docker ps看到,因此不能从localhost:8082访问。

任何人都可以请告诉我我要去哪里吗?

P.s.我在互联网上搜索了很多东西,但无法正确处理。可能是有一些概念,我不清楚。

+1

为什么不使用https://hub.docker.com/_/tomcat/中的参考Tomcat?顺便说一下(这不是你的问题),你应该在你的Dockerfile中将你的RUN分组,请参阅https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/ – user2915097

回答

1

望着docker run command documentation,商务部指出,传递给run任何命令将覆盖原来的CMD在Dockerfile

作为运营商,你可以(在运行从图像容器中的人)重写CMD指令只需指定一个新的COMMAND

1 /然后,当你运行:

docker run -d -p 8082:8080 imageid tail -f /dev/null 

该容器与COMMANDtail -f /dev/null运行,原始命令开始Tomcat是重写

解决您的问题,尝试运行:

docker run -d -p 8082:8080 imageid 

docker log -f containerId 

要查看是否Tomcat是正确启动。

2 /您不应该使用start参数与catalina.sh。看看这个official tomcat Dokerfile,该团队使用:

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

启动Tomcat(当你使用start,码头工人结束容器在shell脚本和tomcat月底将启动,但保持一个正在运行的进程) 。

3 /最后,为什么不使用tomcat官方镜像来构建你的容器?你可以只使用:

FROM tomcat:latest 

指令在你Dockerfile的开始,并添加你需要的元素(新文件,web应用战争,设置)到码头工人的形象。

+1

非常感谢FrançoisMaturel详细回复。 1.我错过了这个概念,它解决了我的问题。 2.我意识到第二点,但在Command命令语句中运行时忽略了它。 3.我可以使用Tomcat的官方镜像,但试图在Tomcat中玩耍并安装lynx ..因此,我可以理解,可以在dockerfile的帮助下安装多个应用程序,尽管它可能不是最佳实践。因此,我需要更多地关注安装应用程序和准备环境的多个dockerfiles。 再次感谢:) – Arindam

+0

@Arindam,不客气。如果你不想在docker周围玩耍,并在tomcat周围添加更多的软件/调整,你仍然可以使用官方图片并添加自己的东西。这样做有时也很好,可以创建容器图像以便真正理解过程;) –