我有一个运行 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
如果进程挂起,您应该找出原因,看看是否确实需要正常终止才能完成此清理操作。