如何正常关闭 Docker 容器

如何正常关闭 Docker 容器

我有一个运行 CentOS 7 的 docker 容器。

它正在以 PID 1 的身份运行脚本wrapper_script.sh。它在 docker compose 中也有以下内容。

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

如果进程挂起,您应该找出原因,看看是否确实需要正常终止才能完成此清理操作。

相关内容