Sauberes Herunterfahren von Containern
Die Sicherstellung eines sauberen Herunterfahrens eines Docker-Containers ist entscheidend für die Integrität Ihrer Anwendung und der von ihr verwalteten Daten. Wenn ein Container gestoppt wird, sollte der darin laufende Hauptprozess die Möglichkeit haben, alle notwendigen Bereinigungsaufgaben durchzuführen, z. B. das Speichern von Daten, das Schließen von Verbindungen oder die Freigabe von Ressourcen.
Verarbeitung von SIGTERM-Signalen
Standardmäßig erhält der Hauptprozess in einem Docker-Container beim Stoppen des Containers ein SIGTERM
-Signal. Dieses Signal dient der Anforderung eines sauberen Herunterfahrens des Prozesses. Um ein korrektes Herunterfahren sicherzustellen, sollte Ihre Anwendung das SIGTERM
-Signal verarbeiten und die notwendigen Bereinigungsaufgaben durchführen, bevor sie beendet wird.
Hier ist ein Beispiel dafür, wie Sie das SIGTERM
-Signal in einer Python-Anwendung verarbeiten können:
import signal
import time
def graceful_shutdown(signum, frame):
print("SIGTERM empfangen, sauberes Herunterfahren...")
## Hier Bereinigungsaufgaben durchführen
time.sleep(5) ## Simulation von Bereinigungsaufgaben
print("Sauberes Herunterfahren abgeschlossen.")
exit(0)
signal.signal(signal.SIGTERM, graceful_shutdown)
## Hauptanwendungslogik
while True:
print("Anwendung läuft...")
time.sleep(1)
In diesem Beispiel ist die Funktion graceful_shutdown
als Handler für das SIGTERM
-Signal registriert. Wenn der Container gestoppt wird, wird diese Funktion aufgerufen, sodass die Anwendung alle notwendigen Bereinigungsaufgaben durchführen kann, bevor sie beendet wird.
Anpassung der Herunterfahrzeitüberschreitung
Standardmäßig wartet Docker 10 Sekunden darauf, dass der Hauptprozess nach Erhalt des SIGTERM
-Signals beendet wird. Wenn der Prozess diese Zeitüberschreitung nicht einhält, sendet Docker ein SIGKILL
-Signal, das den Prozess gewaltsam beendet.
Sie können die Herunterfahrzeitüberschreitung anpassen, indem Sie den Flag --stop-timeout
beim Starten eines Docker-Containers verwenden:
docker run -d --stop-timeout 20 your-image
Dies erhöht die Herunterfahrzeitüberschreitung auf 20 Sekunden und gibt dem Hauptprozess mehr Zeit für ein sauberes Herunterfahren.
Verwendung von Prozessmanagern
Eine weitere Möglichkeit, ein sauberes Herunterfahren sicherzustellen, ist die Verwendung eines Prozessmanagers wie tini
oder dumb-init
als Einstiegspunkt des Containers. Diese Prozessmanager sind darauf ausgelegt, Signale zu verarbeiten und an den Hauptprozess weiterzuleiten, um eine korrekte Herunterfahrsequenz sicherzustellen.
## Beispiel für die Verwendung von tini als Einstiegspunkt für einen Docker-Container
ENTRYPOINT ["/usr/bin/tini", "--", "your-application-command"]
Durch die Verwendung eines Prozessmanagers können Sie die Signalverarbeitung in Ihrer Anwendung vereinfachen und sich darauf verlassen, dass der Prozessmanager den Herunterfahrprozess in Ihrem Namen übernimmt.
Durch das Verständnis und die Implementierung von Mechanismen für ein sauberes Herunterfahren können Sie sicherstellen, dass Ihre Docker-Container sicher gestoppt und neu gestartet werden können, ohne Daten zu verlieren oder auf andere Probleme zu stoßen.