Docker Swarm - 让服务永远保持运行

时间:2017-07-21 19:41:28

标签: docker docker-compose docker-stack

我正在创建一个执行命令来启动程序的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

2 个答案:

答案 0 :(得分:1)

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

作为后退,您可以将sleep infinitytail -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}}命令。