
我有一個運行 CentOS 7 的 docker 容器。
它正在以 PID 1 的身份運行一個腳本wrapper_script.sh
。
CMD ["/wrapper_script.sh"]
我docker stop
在容器上試了一下。它沒有執行清理功能。它是直接停止容器。
試過了docker kill --signal="SIGTERM" <containername>
。它也沒有執行清理功能。另請注意,這並不是殺死/停止容器本身。
請幫忙解決這個問題。任何建議表示讚賞。
wrapper_script.sh
如下:
#!/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
答案1
我不明白 bash 腳本和問題之間的聯繫,但這裡有一些有關停止容器的資訊。
當你發出docker stop
命令時,Docker會先友善地要求進程停止,如果它在預設的10秒內不遵守,它將被強行殺死。如果你的docker stop
返回時間超過10秒,這表示你的容器在這段時間內沒有回應。
該docker stop
命令首先嘗試透過向容器中的根進程(PID 1)發送 SIGTERM 訊號來停止正在運行的容器。如果進程在此逾時內沒有退出,則會傳送 SIGKILL 訊號。
您的進程可能會選擇忽略 SIGTERM 訊號,但它不能忽略 SIGKILL。發出 SIGKILL 後,進程將永遠不會看到該訊號,因此無法執行任何清理操作。
您可以控制 Docker 守護程式在發送 SIGKILL 之前等待的秒數。如果您的進程需要更多時間才能完成,您可以使用以下命令:
docker stop --time=30 mycontainer
如果進程掛起,您應該找出原因,如果它絕對需要優雅地終止才能完成此清理操作。