0

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

我该怎么做呢?我知道您可以使用-td标志来使用普通的旧“docker run”来执行此操作,但是如何使用 compose 文件使用 docker stack 来执行此操作?

编辑:我正在尝试将“无限睡眠”命令附加到命令的末尾,如下所示:

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
4

2 回答 2

1

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

作为回退,您可以将类似sleep infinityor的命令附加tail -f /dev/null到启动脚本的末尾,该命令将无限期阻塞。这种回退在很大程度上是一种黑客行为,应该避免。

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

于 2017-07-21T20:50:35.897 回答
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带有参数的命令infinity

于 2017-07-21T22:09:03.120 回答