如何保持在Docker容器上运行的服务

我试图运行一个简单的docker容器与我的Web应用程序安装(不使用docker文件)。 在testing过程中,我总是使用-t -i选项运行容器,然后通过运行一个shell脚本来启动它内部的tomcat服务。 如何当我转移到生产我不想再使用-t -i选项,只需要我的Tomcat服务启动,并成为唯一的主要服务。

我试图将入口点指向启动tomcat的启动脚本,但是脚本完成后容器终止。 如何运行一个容器,启动一个服务,并保持该服务作为容器的单一主服务?

注意:我读了一些关于主pipe的文章,但不确定是否需要从头开始构build我的映像,如果我走这条路线? 我宁愿不这样做。

有什么build议么?

如果您有一个使用入口点模式的Dockerfile,它将如下所示:

(Dockerfile)

FROM ubuntu ...Some configuration steps... add start.sh /start.sh ENTRYPOINT ["/start.sh"] 

所有你需要做的是确保你的start.sh脚本以某种方式“挂起”。 有些人喜欢尾随系统日志,但尾随任何存在的文件将工作。

(start.sh)

 #!/bin/bash service Your_Service_Or_Whatever start tail -f /var/log/dmesg 

较短的版本:

 FROM ubuntu ...Some configuration steps... ENTRYPOINT ["/bin/sh", "-c", "while true; do sleep 1; done"] 

使用Docker版本1.12.1进行testing,构build23cf638

使用docker --version来找出你的版本

默认情况下,Docker容器将根据Dockerfile的configuration运行。 如果您通常使用-i标志来运行容器,则可以将STDIN打开,以便访问容器入口点,或者可以使用bash shell。 为了实现你想要的,你可以在分离的状态下运行容器,直接将你的命令传递给docker run。

 docker run -d myapp /opt/catalina/bin/startup.sh 

这将在分离状态下运行myapp容器,并将运行作为第三个parameter passing的命令。 如果命令导致长时间的服务,则只要服务处于启用状态,容器就会保持活动状态。

这在文档中有详细的解释 。