Ich habe ein ähnliches Problem beim Ausführen von Linux-Systemen. Nach dem Booten des Systems wurde ein Container mit der Neustartrichtlinie "sofern nicht gestoppt" nicht automatisch neu gestartet, es sei denn, ich gab einen Befehl ein, der Docker auf irgendeine Weise verwendete, z. B. "Docker ps". Ich war überrascht, als ich erwartete, dass dieser Befehl nur einige Statusinformationen meldet. Als nächstes habe ich den Befehl "systemctl status docker" ausprobiert. Auf einem System, auf dem keine Docker-Befehle ausgeführt wurden, meldete dieser Befehl Folgendes:
● 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
Auf einem System, auf dem "Docker ps" ohne andere Docker-Befehle ausgeführt wurde, wurde Folgendes angezeigt:
● 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 ]
Die wahrscheinlichste Erklärung ist, dass Docker auf einen Docker-Befehl wartet, bevor Container vollständig initialisiert und gestartet werden. Sie könnten vermutlich "Docker ps" in einer systemd-Einheitendatei zu einem Zeitpunkt ausführen, nachdem alle Dienste, die Ihre Container benötigen, initialisiert wurden. Ich habe dies getestet, indem ich eine Datei mit dem Namen docker-onboot.service in das Verzeichnis / lib / systemd / system mit folgendem Inhalt gestellt habe:
[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 = multi-user.target
Bisher (ein Test mit aktiviertem Dienst) wurde der Container beim Booten des Computers gestartet. Ich habe keine Abhängigkeit von docker.service versucht, da docker.service erst gestartet wird, wenn ein Docker-Befehl ausgeführt wird. Der nächste Test wird mit deaktiviertem Docker-Onboot durchgeführt (um festzustellen, ob die WantedBy-Abhängigkeit sie automatisch startet).
Systemd
als Service Manager ist eine der besten Lösungen für diesen Zweck und erfordert mehr Upvotes.