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

7
我正在尝试运行一个简单的docker容器,其中安装了我的Web应用程序(不使用docker文件)。 在测试期间,我总是使用-t -i选项运行容器,然后通过运行shell脚本启动其中的tomcat服务。 现在,当我转移到生产环境时,我不想再使用-t -i选项,只需要我的Tomcat服务启动并成为唯一的主要服务。
我尝试将entrypoint指向启动tomcat的脚本,但容器在该脚本完成后终止。 如何运行一个容器,启动一个服务,并将该服务作为容器的单一主要服务?
注意:我阅读了一些有关supervisor的帖子,但不确定如果我选择这条路是否需要从头开始构建我的镜像?我宁愿不这样做。
有什么建议吗?
3个回答

14
如果你有一个使用入口点模式的Dockerfile,它会像这样:
(Dockerfile)
FROM ubuntu

...Some configuration steps...

add start.sh /start.sh

ENTRYPOINT ["/start.sh"]

您需要做的就是确保您的 start.sh 脚本以某种方式“挂起”。有些人喜欢追踪syslog,但追踪任何存在的文件都可以。

(start.sh)

#!/bin/bash

service Your_Service_Or_Whatever start
tail -f /var/log/dmesg

好的,但是如果入口点不是以root身份运行,而且sudo命令也没有安装呢? - cactuschibre
你可以实时追踪任何文件,甚至是在脚本中创建的文件,例如使用 touch /tmp/file && tail -f /tmp/file - Ninjaxor

4
一份简短的版本:
FROM ubuntu

...Some configuration steps...

ENTRYPOINT ["/bin/sh", "-c", "while true; do sleep 1; done"]

本文测试使用的Docker版本为1.12.1,构建版本为23cf638

使用docker --version命令查看你的Docker版本


1
默认情况下,Docker容器将根据镜像中的配置文件Dockerfile运行。如果通常使用-i标志运行容器,则会保持STDIN打开,允许您访问容器入口点或bash shell。为了实现您想要的效果,您可以以分离状态运行容器,并将命令直接传递给docker run。
docker run -d myapp /opt/catalina/bin/startup.sh

这将以分离状态运行myapp容器,并运行作为第三个参数传递的命令。如果该命令导致长时间运行的服务,则容器将保持活动状态,直到该服务结束。

文档中详细解释了这一点


以分离模式运行容器在我这种情况下没有帮助。我需要运行一个shell脚本来启动所需的服务,当shell脚本结束时,容器就会退出...我需要使用我启动的服务作为主要服务来保持容器运行。 - Sneh Shah
您需要以分离状态运行容器,服务需要在前台运行以保持其活动状态。从记忆中,您需要类似于$PATH_TO_TOMCAT/startup.sh run的东西。 - David Barker
尝试过了,它启动了服务,但容器立即退出。似乎发生的情况是它将我用来启动服务的 shell 视为主要服务而不是实际启动的服务。 - Sneh Shah
我建议您构建自己的容器镜像,这样您就可以精确地定义所需的环境。 - David Barker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接