
Ich habe einen Docker-Container, auf dem CentOS 7 läuft.
Es führt ein Skript wrapper_script.sh
als PID 1 aus. Es enthält außerdem Folgendes in der Docker-Zusammenstellung.
CMD ["/wrapper_script.sh"]
Ich habe es docker stop
am 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.sh
ist 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 stop
Befehl 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 stop
Rückkehr länger als 10 Sekunden dauert, bedeutet dies, dass Ihr Container innerhalb dieser Zeit nicht reagiert hat.
Der docker stop
Befehl 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.