使用 restart_policy 部署 Docker 堆栈会抛出“来自守护进程的错误响应:无效的 RestartCondition:“除非停止””

Con*_*nor 3 docker docker-compose

当我尝试使用它运行时docker stack deploy -c docker-compose.yml stack-name,出现错误:Error response from daemon: invalid RestartCondition: "unless-stopped"

如果中断,我需要超级服务和 docker 容器重新启动。如果没有restart_policy(仅--restart unless-stopped用于容器),如果我重新启动我的机器,它只会重新启动容器,而不是服务。超级服务让我可以使用仅限服务的 docker 功能(如机密、配置、资源等)。容器让我可以使用设备。

Docker支持重启策略。我也看到了这个线程,但我不知道该怎么做或者它是否相关。我有点像 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
Run Code Online (Sandbox Code Playgroud)

Docker 版本 18.05.0-ce,构建 f150324

Linux raspberrypi 4.14.50-v7+ #1122 SMP Tue Jun 19 12:26:26 BST 2018 armv7l GNU/Linux

BMi*_*tch 5

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

因此,如果您的容器停止,无论重启策略如何,swarm 模式都会重新创建一个新实例。手动停止一个容器会导致一个新的实例被启动,与失败一样,甚至是滚动更新。

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


Con*_*nor 4

回答我自己的问题:

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

Docker 组合

docker-compose策略可以在这里找到

conditionnoneon-failure或 之一any(默认值:any)。

services:
  service-name:
    deploy:
      restart_policy:
        condition: on-failure
Run Code Online (Sandbox Code Playgroud)

Docker 命令行界面

docker cli政策可以在这里找到

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

  • on-failure[:max-retries] 仅当容器以非零退出状态退出时才重新启动。(可选)限制 Docker 守护进程尝试重新启动的次数。

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

  • unless-stopped 无论退出状态如何,始终重新启动容器,包括在守护进程启动时,除非容器在 Docker 守护进程停止之前进入停止状态。