docker-compose `restart:always` 随机不起作用

ada*_*ily 5 debian docker docker-compose

我管理一些安装了 Docker CE 的 Debian 服务器,并且 docker-compose 编排了多个服务(每台机器大约 20 个容器)。

每个服务都配置有restart: always每个服务都在 docker-compose 中但是,有一些随机服务(通常每台计算机有 1-2 个)可以正确关闭,但在主机重新启动期间不会重新启动。这种行为是完全随机的。有时所有服务都会启动,有时 docker-compose.yml 文件中的一项服务不会重新启动。

以下是 Traefik 正确关闭但未出现的示例:

  1. 配置为自动重启的服务:
$ cat docker-compose.yml
version: '3'

services:
  reverse-proxy:
    image: traefik:1.7
    restart: always
    command: --web
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/traefik.toml
    networks:
      - web

Run Code Online (Sandbox Code Playgroud)
  1. 退出代码是 128
$ docker-compose ps
         Name                Command        State     Ports
-----------------------------------------------------------
traefik_reverse-proxy_1   /traefik --web   Exit 128
Run Code Online (Sandbox Code Playgroud)
  1. 日志显示该服务已正确关闭,但此后没有任何活动迹象:
$ docker-compose logs --tail 6 -t
Attaching to traefik_reverse-proxy_1
reverse-proxy_1  | 2022-01-21T14:05:28.042399112Z time="2022-01-21T14:05:28Z" level=info msg="Stopping server gracefully"
reverse-proxy_1  | 2022-01-21T14:05:28.042450915Z time="2022-01-21T14:05:28Z" level=debug msg="Waiting 10s seconds before killing connections on entrypoint http..."
reverse-proxy_1  | 2022-01-21T14:05:28.042463326Z time="2022-01-21T14:05:28Z" level=debug msg="Waiting 10s seconds before killing connections on entrypoint api..."
reverse-proxy_1  | 2022-01-21T14:05:28.053256515Z time="2022-01-21T14:05:28Z" level=debug msg="Entrypoint api closed"
reverse-proxy_1  | 2022-01-21T14:05:28.053283046Z time="2022-01-21T14:05:28Z" level=debug msg="Entrypoint http closed"
reverse-proxy_1  | 2022-01-21T14:05:28.059721498Z time="2022-01-21T14:05:28Z" level=info msg="Shutting down"
Run Code Online (Sandbox Code Playgroud)
  1. 服务器正常运行时间与关闭消息相对应:
$ uptime
 11:21:31 up 29 days, 20:15,  1 user,  load average: 0.46, 0.43, 0.44
Run Code Online (Sandbox Code Playgroud)
  1. 我的 docker 版本如下:
$ docker --version
Docker version 19.03.12, build 48a66213fe
Run Code Online (Sandbox Code Playgroud)

我们不要单独关注 Traefik,因为哪个容器不启动以及何时启动是完全随机的。