我正在创建一个执行命令来启动程序的docker服务,但问题是服务一直在终止,因为一旦启动命令完成,docker认为它已完成并终止并再次启动它。我想更改此行为,以便docker服务运行,完成其命令,然后在命令完成后永远保持运行。
我该怎么做?我知道你可以使用-td
标志用一个普通的“docker run”来做这个,但是如何使用compose文件用docker stack做这个呢?
编辑:我试图在命令的末尾附加一个“sleep infinity”命令,如下所示:
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
答案 0 :(得分:1)
首选解决方案,以及docker hub中大多数映像所使用的解决方案,是重新设计启动脚本以在前台运行应用程序。执行此操作的步骤因应用程序而异,因此请检查集线器以了解其他人在您之前是如何完成此操作的。
作为后退,您可以将sleep infinity
或tail -f /dev/null
等命令附加到启动脚本的末尾,该命令将无限期地阻止。这种退步非常严重,应该避免。
编辑:要在脚本之外运行此命令,您可以将命令更改为CMD /opt/xyz/start.sh && sleep infinity
(删除双引号)。 Docker应该将其转换为/bin/sh -c "/opt/xyz/start.sh && sleep infinity"
。请注意,这些是在黑客攻击之上添加黑客攻击,我继续建议您避免使用此解决方案。
答案 1 :(得分:0)
CMD "/opt/<redacted>/start.sh; sleep infinity"
这告诉Docker找到并运行此可执行文件文件:
/opt/<redacted>/start.sh; sleep infinity
但该路径不作为文件存在,因此它告诉您无法找到它。
你需要删除引号,它们让人感到困惑。
CMD /opt/<redacted>/start.sh; sleep infinity
现在它将尝试查找并运行文件/opt/<redacted>/start.sh
,然后运行带有参数sleep
的{{1}}命令。