如何優雅地關閉 Docker 容器

如何優雅地關閉 Docker 容器

我有一個運行 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

如果進程掛起,您應該找出原因,如果它絕對需要優雅地終止才能完成此清理操作。

相關內容