使用tomcat image的困惑

tomcat的dockerfile中为

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

这导致启动image时,attach到容器内部时,停留在的交互界面为catalina.out的log日志中,无法退出日志且保持tomcat不stop。这相信是很多人觉得不方便的地方。如何修改呢?

CMD与RUN

很多文章都有讲这两个的区别,这里就不赘述了。纪录一下自己的理解。 CMD命令:

CMD:image默认启动为container时的指令。

还有一个重点:每个Dockerfile只有最后一个CMD起作用。为什么是这样:因为是默认的初始指令,必须有明确的一个,所以后面的指令都会覆盖之前的CMD。 RUN命令:

RUN:容器中执行的命令

问题

我的Dockerfile大致逻辑(请忽略语法错误):

From tomcat:latest
RUN [修改catalina.sh配置]
RUN [catalina.sh run]
CMD ["/bin/bash"]

该dockerfile build得到的image,运行为容器时,该容器中可以与用户进行交互,但是ps没有看到tomcat启动。

为什么出现上述情况?

CMD是默认的启动指定,在上述dockerfile中,<pre>CMD [“/bin/bash”]</pre>覆盖了base image tomcat的<pre>CMD [“catalina.sh”,”run”]</pre>。很多人会说那我们CMD之前不是还有RUN执行吗?RUN指令在前面说过:是在容器之中指定脚本等的指令。RUN中的运行catalina.sh的run,是在容器中运行的,容器刚启动是不会执行的,因为RUN不是CMD。

目标:catalina启动并且停留在bash shell以便交互

修改CMD:

CMD ["/bin/bash","-c","catalina.sh run ; /bin/bash"]

结果:tomcat启动了,但是还是停留在catalina.out的log日志中。这是因为shell命令用<pre>;</pre>连接时,前一个命令必须return 执行结果,也就是结束时,才会进行后一个shell命令。

修改CMD:

CMD ["/bin/bash","-c","catalina.sh start;/bin/bash"]

bingo!!!

catalina.sh run & start

run为停留在该窗口启动tomcat;start为另起窗口启动tomcat。