Docker stack deploy with restart“策略抛出”;来自后台程序的错误响应:无效的重新启动条件:";除非停止”&引用;

Docker stack deploy with restart“策略抛出”;来自后台程序的错误响应:无效的重新启动条件:";除非停止”&引用;,docker,docker-compose,Docker,Docker Compose,当我尝试使用docker stack deploy-c docker-compose.yml stack name运行此程序时,我收到错误:来自后台程序的错误响应:无效重启条件:“除非停止” 如果中断,我需要superservice和docker容器重新启动。如果没有restart\u策略(仅对容器使用--restart,除非已停止),则如果我重新启动计算机,它只会重新启动容器,而不是服务。超级服务允许我使用仅服务的docker功能(如机密、配置、资源等)。容器允许我使用设备 码头工人。我也看到

当我尝试使用
docker stack deploy-c docker-compose.yml stack name
运行此程序时,我收到错误:
来自后台程序的错误响应:无效重启条件:“除非停止”

如果中断,我需要superservice和docker容器重新启动。如果没有
restart\u策略
(仅对容器使用
--restart,除非已停止
),则如果我重新启动计算机,它只会重新启动容器,而不是服务。超级服务允许我使用仅服务的docker功能(如机密、配置、资源等)。容器允许我使用设备

码头工人。我也看到了,但我不确定这是怎么回事,也不确定是否有关联。我有点像码头工人

我的
docker compose.yml
文件:

version: "3.2"
services:
  superservice:
    image: docker
    command: docker run -it --restart unless-stopped --device=/dev/video0 --volume=/path:/path --name container_name my/image
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      replicas: 1
      mode: replicated
      restart_policy:
        condition: unless-stopped
      resources:
        limits:
          cpus: '0.70'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      placement:
        constraints: [node.role == manager]
    stdin_open: true
    tty: true
Docker版本18.05.0-ce,版本f150324


Linux raspberrypi 4.14.50-v7+#1122 SMP周二6月19日12:26:26英国夏令时2018 armv7l GNU/Linux回答我自己的问题:

重启策略不会从docker compose以1:1映射到docker cli

Docker Compose 可以找到docker compose策略

条件
:故障时的
任何
(默认值:
任何
)之一

Docker CLI 可以找到docker cli策略

  • 当容器退出时,不要自动重新启动容器。这是默认设置

  • 失败时[:最大重试次数]
    仅当容器以非零退出状态退出时重新启动。(可选)限制Docker守护程序尝试重新启动的重试次数

  • 始终
    无论退出状态如何,始终重新启动容器。当您指定always时,Docker守护进程将尝试无限期地重新启动容器。无论容器的当前状态如何,容器也将始终在守护进程启动时启动

  • 除非停止
    始终重新启动容器,无论退出状态如何,包括守护程序启动时,除非容器在Docker守护程序停止之前处于停止状态


如果作为堆栈部署,则不需要重新启动策略,我甚至看到它在极端情况下(主机内存不足)会导致崩溃。这是因为swarm模式查看您定义的目标状态,将其与当前状态进行比较,并协调任何差异

因此,如果容器停止,swarm模式将重新创建一个新实例,而不管重启策略如何。手动停止容器将导致启动新实例,这与失败相同,甚至导致滚动更新


若要手动停止swarm模式管理的容器,您需要推送一个新的目标状态,其中该服务有0个副本作为新目标。

因为除非停止,否则
不是重新启动策略条件的有效值。目前没有一种好的方法来管理您想要做的事情,更多详细信息如下:@johnharris85它不适用于
总是
,也不适用于
失败时的
。Connor
总是
也不是一个选项,请参见该链接。“不工作”是什么意思<代码>失败时
应该可以正常工作。@johnharris85你说得对,我原以为这些选项与我在<代码>docker run--重新启动策略
中引用的选项相同。如果你想发布一个回答,基本上说,
docker run
docker compose
有不同的语法,这些语法是什么,我会接受。非常非常有用,谢谢。澄清为什么这些工具有不同的命令,我将留下我的答案作为接受的答案,因为我最初的问题是关于失败的原因。如果你不同意这一点,请告诉我know@BMitch,如果要限制容器在swarm模式下失败时的重试次数,请告诉我们可以使用什么?@Deepti-l我不知道有什么。如果由于外部依赖而失败,您通常希望它继续重试。如果它因为映像损坏而下降,部署上的回滚策略通常是您想要的?这两种方法都有效吗?任何方法都适用于docker compose,始终适用于docker Clin答案中包含的信息,我知道答案可能不那么清楚,我如何编辑答案以使其更清楚?啊,我现在明白你的意思了。如果你问我,“docker compose”和“docker cli”的字体大小是否大于“Policy Result”,我会更清楚。这将更清楚地表明,它们是两个不同的标题,“策略结果”是“docker cli”的一部分。很抱歉,现在无法从我的手机执行此操作。很好,我会处理它,感谢您帮助我改进:)
services:
  service-name:
    deploy:
      restart_policy:
        condition: on-failure