So fahren Sie einen Docker-Container ordnungsgemäß herunter

So fahren Sie einen Docker-Container ordnungsgemäß herunter

Ich habe einen Docker-Container, auf dem CentOS 7 läuft.

Es führt ein Skript wrapper_script.shals PID 1 aus. Es enthält außerdem Folgendes in der Docker-Zusammenstellung.

CMD ["/wrapper_script.sh"]

Ich habe es docker stopam Container versucht. Die Bereinigungsfunktion wird nicht ausgeführt. Der Container wird direkt gestoppt.

Versucht docker kill --signal="SIGTERM" <containername>. Die Bereinigungsfunktion wird auch nicht ausgeführt. Beachten Sie auch, dass der Container selbst dadurch nicht beendet/gestoppt wird.

Bitte helfen Sie, dieses Problem zu beheben. Jeder Vorschlag ist willkommen.

wrapper_script.shist wie folgt:

#!/usr/bin/env bash
cleanup() {
    echo "Cleaning up..."
    /wrapper-script-stop.sh
}
trap 'cleanup' SIGTERM EXIT
/run-something.sh
while sleep 60; do
  ps aux |grep run-something.sh |grep -q -v grep
  PROCESS_1_STATUS=$?
  if [ $PROCESS_1_STATUS -ne 0 ]; then
    echo "One of the processes has already exited."
    exit 1
  fi
done

Antwort1

Ich verstehe den Zusammenhang zwischen dem Bash-Skript und der Frage nicht, aber hier sind einige Informationen zum Stoppen eines Containers.

Wenn Sie einen docker stopBefehl erteilen, fordert Docker den Prozess zunächst höflich auf, anzuhalten. Wenn dies nicht innerhalb der standardmäßigen 10 Sekunden geschieht, wird er zwangsweise beendet. Wenn die docker stopRückkehr länger als 10 Sekunden dauert, bedeutet dies, dass Ihr Container innerhalb dieser Zeit nicht reagiert hat.

Der docker stopBefehl versucht zunächst, einen laufenden Container zu stoppen, indem er ein SIGTERM-Signal an den Root-Prozess (PID 1) im Container sendet. Wenn der Prozess innerhalb dieses Timeouts nicht beendet wird, wird ein SIGKILL-Signal gesendet.

Es ist möglich, dass Ihr Prozess das SIGTERM-Signal ignoriert, aber ein SIGKILL-Signal nicht. Nachdem das SIGKILL-Signal ausgegeben wurde, wird der Prozess das Signal nie sehen und kann daher keine Bereinigungsaktion durchführen.

Sie können die Anzahl der Sekunden steuern, die der Docker-Daemon wartet, bevor er SIGKILL sendet. Wenn Ihr Prozess mehr Zeit zum Beenden benötigt, können Sie einen Befehl wie den folgenden verwenden:

docker stop --time=30 mycontainer

Wenn der Prozess hängen bleibt, sollten Sie die Ursache herausfinden und prüfen, ob er unbedingt ordnungsgemäß beendet werden muss, damit diese Bereinigungsaktion durchgeführt werden kann.

verwandte Informationen