Shutdown kann Docker-Container (systemd) nicht herunterfahren

Shutdown kann Docker-Container (systemd) nicht herunterfahren

Ich betreibe eine Reihe von Docker-Containern auf meinem Ubuntu-Server. Sie werden von systemd gesteuert.

Wenn ich es ausführe, wird der Container ordnungsgemäß heruntergefahren. Die Ausgabe von journalctl ist wie folgt (Ausgabe in umgekehrter Zeit, neueste oben):systemctl stop [email protected]

Nov 05 10:58:11 ubox0 systemd[1]: Stopped Docker container startup for mw/salcom/app.
Nov 05 10:58:11 ubox0 docker[3622]: mw-salcom-app
Nov 05 10:58:09 ubox0 docker[3470]: [Thu Nov 05 10:58:09.921033 2020] [mpm_prefork:notice] [pid 1] AH00169: caught SIGTERM, shutting down
Nov 05 10:58:09 ubox0 systemd[1]: Stopping Docker container startup for mw/salcom/app...

Wenn ich jedoch ausführe shutdown -h now, erhalte ich:

Nov 05 10:51:04 ubox0 systemd[1]: Stopped Docker container startup for mw/salcom/app.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Failed with result 'timeout'.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Main process exited, code=killed, status=9/KILL
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Killing process 2077 (docker) with signal SIGKILL.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: State 'stop-sigterm' timed out. Killing.
Nov 05 10:50:04 ubox0 systemd[1]: [email protected]: Stopping timed out. Terminating.
Nov 05 10:49:04 ubox0 systemd[1]: Stopping Docker container startup for mw/salcom/app...

Der Container wird nicht angehalten und der Vorgang läuft nach 2 Minuten schließlich ab und der Container wird abgebrochen.

Was ist der Grund dafür?

Ich möchte, dass meine Container ordnungsgemäß heruntergefahren werden, sodass die darin ausgeführten Dienste ohne Datenverlust gestoppt werden.

Meine Serviceakte lautet:

[Unit]
Description=Docker container startup for %I
Requires=docker.service
After=docker.service

[Service]
TimeoutStartSec=40
Restart=always
# wait a while before restarting in case we are doing a restore;
# this includes a 'docker stop' command after we restore the data
RestartSec=60
ExecStartPre=-/usr/bin/docker stop %i
ExecStart=/usr/bin/docker start -a %i
ExecStop=/usr/bin/docker stop %i
TimeoutStopSec=60

[Install]
WantedBy=multi-user.target

AktualisierenNachdem ich weiter gesucht hatte, fand ich diesen BeitragWie behandelt man einen Docker-Container richtig als Systemd-Dienst?beschreibt das gleiche Problem, aber dort gibt es keine Antwort.

Antwort1

Es scheint, dass Docker und Systemd nicht immer sehr gut miteinander auskommen, siehe:

Ich habe genau das gleiche Setup auf einer anderen Maschine (meinem Backup-Server) und hier funktioniert alles einwandfrei. Ich kann den Shutdown-Befehl ausführen und alle Docker-Container werden ordnungsgemäß heruntergefahren.

Das Problem könnte also ein Abhängigkeitsproblem sein. Vielleicht hat systemd einen Dienst heruntergefahren, der von den Docker-Containern benötigt wird, damit sie ordnungsgemäß heruntergefahren werden können.

Die Docker-Version auf dem System, das „fehlschlägt“, ist 18.09.2, auf dem System, das „funktioniert“, ist sie 18.06.1-ce.

DerVersionshinweisefür den Docker-Versionsstatus 18.09:

In Docker versions prior to 18.09, containerd was managed
by the Docker engine daemon. In Docker Engine 18.09, 
containerd is managed by systemd.

Als ich meinen Unit-Dateien die folgenden Zeilen hinzufügte:

[Unit]
...
Requires=containerd.service
After=containerd.service

und die Unit-Dateien neu geladen ( systemctl daemon-reload), funktionierte alles wieder. Meine Container wurden nach dem von mir eingestellten Timeout von 1 Minute nicht beendet, sondern nach ein paar Sekunden heruntergefahren.

Ich habe zuerst versucht, Docker auf die Version zu aktualisieren 20.10.1, ohne Erfolg.

Ich kam auf die Idee zu dieser „Lösung“, als ich auf Folgendes stieß:https://github.com/sous-chefs/docker/issues/1062

verwandte Informationen