Docker Swarm - 获取服务以保持 运行 永远

Docker Swarm - Get Service to Stay Running Forever

我正在创建一个 docker 服务来执行启动程序的命令,但问题是该服务不断终止,因为一旦启动命令完成,docker 认为它已经完成并终止并再次启动它。我想更改此行为,以便 docker 服务运行,完成其命令,然后在其命令完成后永远保持 运行。

我该怎么做?我知道您可以使用 -td 标志对普通的旧 "docker run" 执行此操作,但如何使用撰写文件对 docker 堆栈执行此操作?

编辑:我正在尝试将 "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

首选解决方案,也是 docker 中心中大多数图像使用的解决方案,是将启动脚本重新设计为 运行 您在前台的应用程序。执行此操作的步骤因应用程序而异,因此请查看中心以了解其他人在您之前是如何完成的。

作为回退,您可以将 sleep infinitytail -f /dev/null 之类的命令附加到启动脚本的末尾,这将无限期地阻止。这种回退是一种黑客行为,应该避免。

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

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

这告诉 Docker 找到并 运行 这个可执行文件 file:

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

但是那个路径不作为文件存在,所以它告诉你找不到那个。

您需要删除引号,它们会造成混淆。

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

现在它将尝试定位并 运行 文件 /opt/<redacted>/start.sh,然后 运行 使用参数 infinity 执行 sleep 命令。