我在运行 Linux 系统时遇到了类似的问题。系统启动后,重启策略为“除非停止”的容器不会自动重启,除非我输入了以某种方式使用 docker 的命令,例如“docker ps”。我很惊讶,因为我预计该命令只会报告一些状态信息。接下来我尝试了命令“systemctl status docker”。在没有运行 docker 命令的系统上,此命令报告以下内容:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
Active: inactive (dead) TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
在没有其他 Docker 命令的情况下运行“docker ps”的系统上,我得到以下信息:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
Active: active (running) since Sun 2020-11-22 08:33:23 PST; 1h 25min ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 3135 (dockerd)
Tasks: 13
Memory: 116.9M
CGroup: /system.slice/docker.service
└─3135 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
... [various messages not shown ]
最可能的解释是 Docker 在完全初始化和启动容器之前会等待一些 docker 命令。在初始化容器所需的所有服务之后,您可能可以在 systemd 单元文件中运行“docker ps”。我已经通过将名为 docker-onboot.service 的文件放在目录 /lib/systemd/system 中进行了测试,其中包含以下内容:
[Unit]
# This service is provided to force Docker containers
# that should automatically restart to restart when the system
# is booted. While the Docker daemon will start automatically,
# it will not be fully initialized until some Docker command
# is actually run. This unit merely runs "docker ps": any
# Docker command will result in the Docker daemon completing
# its initialization, at which point all containers that can be
# automatically restarted after booting will be restarted.
#
Description=Docker-Container Startup on Boot
Requires=docker.socket
After=docker.socket network-online.target containerd.service
[Service]
Type=oneshot
ExecStart=/usr/bin/docker ps
[Install]
WantedBy=多用户.target
到目前为止(一项测试,启用此服务),容器在计算机启动时启动。我没有尝试对 docker.service 的依赖,因为 docker.service 在运行 docker 命令之前不会启动。下一个测试将禁用 docker-onboot(查看 WantedBy 依赖项是否会自动启动它)。