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
,然后运行带有参数infinity
的sleep
命令。
首选解决scheme,以及Docker集线器中大多数图像所使用的解决scheme是重新devise启动脚本以在前台运行应用程序。 这样做的步骤因应用程序而异,因此请检查中心,看看其他人是如何做到的。
作为回退,您可以追加一个如sleep infinity
或tail -f /dev/null
,该命令将无限期地阻塞到启动脚本的末尾。 这回落是非常黑客,应该避免。
编辑:要在脚本之外运行,可以将命令更改为CMD /opt/xyz/start.sh && sleep infinity
(删除双引号)。 Docker应该把它变成/bin/sh -c "/opt/xyz/start.sh && sleep infinity"
。 请注意,这些是在黑客之上添加黑客,我仍然build议您避免使用此解决scheme。