Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker Swarm-让服务永远保持运行_Docker_Docker Compose_Docker Stack - Fatal编程技术网

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

Docker Swarm-让服务永远保持运行,docker,docker-compose,docker-stack,Docker,Docker Compose,Docker Stack,我正在创建一个docker服务,它执行一个命令来启动一个程序,但问题是该服务一直在终止,因为一旦启动命令完成,docker就会认为它完成了,然后终止并再次启动它。我希望更改此行为,以便docker服务运行、完成其命令,然后在其命令完成后永远保持运行 我该怎么做?我知道您可以使用-td标志在普通的旧docker运行中执行此操作,但是如何使用docker堆栈使用compose文件执行此操作 编辑:我试图在命令末尾附加一个sleep infinity命令,如下所示: FROM ubuntu:16.04

我正在创建一个docker服务,它执行一个命令来启动一个程序,但问题是该服务一直在终止,因为一旦启动命令完成,docker就会认为它完成了,然后终止并再次启动它。我希望更改此行为,以便docker服务运行、完成其命令,然后在其命令完成后永远保持运行

我该怎么做?我知道您可以使用-td标志在普通的旧docker运行中执行此操作,但是如何使用docker堆栈使用compose文件执行此操作

编辑:我试图在命令末尾附加一个sleep infinity命令,如下所示:

FROM ubuntu:16.04
ADD <redacted> /opt/<redacted>
CMD "/opt/<redacted>/start.sh; sleep infinity"

首选的解决方案,也是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。请注意,这些都是在hack之上添加hack,我继续建议您避免使用此解决方案

CMD "/opt/<redacted>/start.sh; sleep infinity"
这是告诉Docker查找并运行此可执行文件:

但该路径不作为文件存在,因此它告诉您它找不到该路径

你需要去掉引号,它们让人困惑

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

现在,它将尝试定位并运行文件/opt//start.sh,然后运行参数为infinity的sleep命令。

启动命令完成后,容器应该做什么?它只是占用了磁盘空间,还是您希望它提供某种服务?容器正在提供服务。。基本上,有一个启动服务的脚本,但问题是一旦服务启动,启动服务的脚本就存在,代码为0,因为脚本所做的只是引导它。所以docker认为它完成了并关闭了它。无法重写脚本。我必须利用我所拥有的。我尝试了附加睡眠解决方案,但不起作用。。它抱怨/bin/sh:sleep not found这很奇怪,因为如果我手动运行容器并附加它,我就可以运行sleep了。请在您的问题中包含一个,以便我可以提供进一步的帮助。
/opt/<redacted>/start.sh; sleep infinity
CMD /opt/<redacted>/start.sh; sleep infinity