【问题标题】:Containers not restarted after update with restart always in docker-compose.yml更新后容器未重启,docker-compose.yml 中始终重启
【发布时间】:2020-11-02 11:22:19
【问题描述】:

我有一些容器,它们在 docker-compose 文件中都有总是重启值,如下所示:

version: "3.7"
services:

  container:
    image: ghost:latest
    container_name: some_container
    restart: always
    depends_on:
       - ...
    ports:
       - ...
...

一旦操作系统(Flatcar Linux / CoreOS)自我更新,容器就不会重新启动。但是如果我只是做$ sudo docker ps,所有的容器都会立即启动。这是怎么回事?如何修复它,以便我的容器在更新后自动重启?

编辑:

不确定我的问题有什么不清楚的地方,restart: always 已打开。除非我在文档中遗漏了一些重要的东西,否则即使重新启动 docker 守护程序(在操作系统重新启动之后),此命令也应该重新启动容器。

从下面复制一个我的 cmets:

好的,请帮帮我。正如你在我的问题中看到的,我有 重启:始终开启。所有这些容器都已启动 成功并且运行良好。然后操作系统会自行更新 自动并重新启动。在此之后重新启动泊坞窗 守护程序重新启动。但由于某些原因,我运行的容器 开启RESTART: ALWAYS 不会启动。如果我进入我的服务器 此时,输入sudo docker ps 列出我正在运行的容器, 突然所有容器都启动了,我看到了列表。所以为什么 即使守护程序正在运行,容器是否已启动?

【问题讨论】:

  • 所以你想在主机重启后自动启动 docker 容器?
  • 我想要重启的容器:总是在配置中重启,是的。
  • docker是如何安装的?并且你能在运行 docker ps 之前验证引擎是否正在运行(dockerd 进程)吗?
  • Flatcar-linuxCoreOS 的一个分支,其中 docker 已预先安装。如果服务没有运行,为什么 docker 命令会起作用?我该如何检查?
  • 谢谢。应该检查一下!重新启动后它处于非活动状态,我认为它在 docker ps 工作时处于活动状态。 systemctl 是否启用了 docker,现在它按预期工作。写一个答案!

标签: docker docker-compose coreos


【解决方案1】:

从 cmets 看来,docker 服务未配置为在启动时自动启动。 Docker 是一个客户端服务器应用程序,服务器从 systemd 运行,并为客户端用于与服务器通信的 docker 套接字提供单独的服务。因此,任何使用 docker 命令的调用都有可能通过点击 docker 套接字来启动服务器。

systemd 中的服务状态可以通过以下方式检查:

systemctl status docker

或者你可能想检查一下:

systemctl is-enabled docker

可以手动启动:

systemctl start docker

并且可以启用以开始:

systemctl enable docker

以上所有命令都需要以root身份运行。

【讨论】:

    【解决方案2】:

    这需要 Docker 服务在启动时启动,而不是使用默认的套接字激活,就像您在执行“docker ps”时描述的那样按需启动

    这是在禁用套接字激活的同时启用 Docker 服务所需的 Container Linux 配置:

    systemd:
      units:
        # Ensure docker starts automatically instead of being socket-activated
        - name: docker.socket
          enabled: false
        - name: docker.service
          enabled: true
    

    【讨论】:

      【解决方案3】:

      always 如果容器停止,请始终重新启动容器。如果是手动停止的话,只有在Docker daemon重启时才会重启,或者容器本身是手动重启的。

      unless-stoppedalways 类似,不同之处在于当容器停止(手动或其他方式)时,即使在 Docker 守护进程重新启动后也不会重新启动。

      如果您有一个已经在运行的容器想要更改其重启策略,您可以使用docker update command 来更改它,下面的命令将确保所有当前正在运行的容器都将重新启动,除非停止

      $ docker update --restart unless-stopped $(docker ps -q)
      

      注意:使用重启策略时请记住以下几点

      1. 重启策略只有在容器启动成功后才会生效。在这种情况下,启动成功意味着容器至少启动了 10 秒,并且 Docker 已经开始对其进行监控。这可以防止根本没有启动的容器进入重启循环。

      2. 如果你手动停止一个容器,它的重启策略会被忽略,直到 Docker 守护进程重启,或者容器被手动重启。这是防止重启循环的另一种尝试。

      3. 重启政策仅适用于容器。 swarm 服务的重启策略配置不同

      Documentation

      【讨论】:

      • 好的,请帮帮我。正如您在我的问题中看到的那样,我已经重新启动:始终打开。所有这些容器都成功启动并且运行良好。然后操作系统会自动更新并重新启动。重新启动后,docker 守护程序将重新启动。但是由于某些原因,我运行的容器 WITH RESTART: ALWAYS 打开 DOES NOT START。如果我此时进入我的服务器,输入 sudo docker ps 列出我正在运行的容器,突然所有容器都启动了,我看到了列表。那么为什么容器没有启动,即使守护进程正在运行呢?
      • 我将策略更改为始终重启,但我认为 docker-compose stop/start 不会重新加载这些设置。这个命令对我有用
      【解决方案4】:

      这是容器重启策略。 restart: always 如果容器停止,则重新启动容器。如果是手动停止,只有在Docker daemon重启或者容器本身手动重启时才会重启。请查看这个链接restart_policy

      【讨论】:

      • 我看不出这有什么帮助。由于 coreos 会自动更新,我不会手动关闭容器。一旦系统重新启动,容器由于某种原因不会再次启动,即使 Docker 守护程序已启动。
      【解决方案5】:

      如果之前已经创建了 docker 容器,它的 [重启策略][1] 可能不会通过在 docker compose YAML 文件中更改来自动更新。 如果您在 YAML 文件中更改 Restart Policy

      # cat docker-compose.yml 
      version: "3"
      services:
        <your-service>:
          restart: always
      

      您可以查看 RestartPolicy 具有旧值的容器详细信息:

      # docker inspect <your-container> | fgrep -i restart -A 5
              
          "RestartCount": 0,
      --
                  "RestartPolicy": {
                      "Name": "",
      

      Name 是重启策略名称!并且没有值,这意味着没有设置重启策略,并且使用默认值 [no][1]。
      所以你可能不仅需要更新文件中的Restart Policy,还需要手动更新预先创建的容器:

      # docker update <your-container> --restart always
      

      所以新的值被改变了:

      # docker inspect <your-container> | fgrep -i restart -A 5
              "RestartCount": 0,
      --
                  "RestartPolicy": {
                      "Name": "always",
                      "MaximumRetryCount": 0
                  },
      

      就这个:(
      [1]:https://docs.docker.com/config/containers/start-containers-automatically/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-16
        • 2018-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 2020-04-09
        • 1970-01-01
        相关资源
        最近更新 更多