Docker Swarm – 获取服务永久运行

我正在创build一个docker服务来执行一个命令来启动一个程序,但问题是服务会一直停止,因为一旦启动命令完成,docker会认为它已经完成并终止并重新启动。 我想改变这种行为,以便docker服务运行,完成它的命令,然后在其命令完成后永远保持运行。

我该怎么做呢? 我知道你可以使用-td标志来做到这一点与普通的旧“docker运行”,但我怎么做docker堆栈使用撰写文件?

编辑:我试图追加一个“睡眠无限”命令到这样的命令结束:

 FROM ubuntu:16.04 ADD <redacted> /opt/<redacted> CMD "/opt/<redacted>/start.sh; sleep infinity" 

使用docker stack deploy运行结果如下:

 /bin/sh: 1: /opt/<redacted>/start.sh; sleep infinity: not found 

 CMD "/opt/<redacted>/start.sh; sleep infinity" 

这是告诉dockerfind并运行这个可执行文件

 /opt/<redacted>/start.sh; sleep infinity 

但是这个path并不是作为一个文件存在的,所以它告诉你它找不到那个文件。

你需要删除引号,他们是混乱的东西。

 CMD /opt/<redacted>/start.sh; sleep infinity 

现在,它将尝试find并运行文件/opt/<redacted>/start.sh ,然后运行带有参数infinitysleep命令。

首选解决scheme,以及Docker集线器中大多数图像所使用的解决scheme是重新devise启动脚本以在前台运行应用程序。 这样做的步骤因应用程序而异,因此请检查中心,看看其他人是如何做到的。

作为回退,您可以追加一个如sleep infinitytail -f /dev/null ,该命令将无限期地阻塞到启动脚本的末尾。 这回落是非常黑客,应该避免。

编辑:要在脚本之外运行,可以将命令更改为CMD /opt/xyz/start.sh && sleep infinity (删除双引号)。 Docker应该把它变成/bin/sh -c "/opt/xyz/start.sh && sleep infinity" 。 请注意,这些是在黑客之上添加黑客,我仍然build议您避免使用此解决scheme。