我在一个Docker容器中有一个入口点脚本,看起来如下所示:
#!/bin/bash
echo starting up
function shut_down() {
echo shutting down
pid=$(ps -e | grep myapp | awk '{print $1}')
kill -SIGTERM $pid
exit
}
trap "shut_down" SIGKILL SIGTERM SIGHUP SIGINT EXIT
/opt/myapp
我不知道如何捕获通过在容器上运行docker stop
发送的信号,当交互运行时,ctrl+c
将按预期触发它,但docker stop
命令只等待10秒超时,并退出而不进入shut_down
函数
如何在bash中捕获docker stop
发送的信号以进行一些清理?
4条答案
按热度按时间ldioqlga1#
老问题了,但这个问题很有用:
详情请看这里:https://akomljen.com/stopping-docker-containers-gracefully/
ymzxtsji2#
看看this,可能会很有启发性:-)
@nick-humrich在这里,这是我的蹩脚副本和过去(信贷去原作者https://github.com/lgierth)
siv3szwd3#
从Docker 1.9开始,您可以在
Dockerfile
中使用STOPSIGNAL
指令:STOPSIGNAL
设置将发送到容器以退出的系统调用信号。该信号可以是与内核的syscall表中的位置匹配的有效无符号数字,例如9,或者是SIGNAME格式的信号名称,例如SIGKILL。图片来源:https://docs.docker.com/engine/reference/builder/#stopsignal
3zwjbxry4#
在我的例子中,简单地设置一个陷阱是不起作用的,我必须将进程设置为后台来捕捉信号,否则信号会传到启动的进程本身。
起始脚本的最后一行是:
我用下面的代码替换了这一行:
这样,“焦点”就不在守护进程上了。相反,它在启动脚本上。我看起来只有“焦点”进程(前台进程)才能得到信号。