通过以下命令可以直接传递一个kill
信号运行的容器:
docker kill -s SIGTERM containID
但是对于一些情况,比如一个python
服务,这个信号并不能被预期那样地捕获。比如通常会使用while True: sleep(1)
来作为永续循环。
对于Docker
来说,sleep(1)
其最后的命令,kill
信号只能作用于这一命令,signal
并不能捕获这个信号。
在搜索了解决方法后,看到这篇文章《通过信号解决docker启动容器后Exited退出的问题》。里面有一些解决方案,最后作者给出一个Github
项目。这个方法,本质上是在容器中用一个.sh
脚本来运行服务,最后由shell
来捕获命令并在容器内部kill
掉服务。
#/bin/bash
cd /path/to/work
python flask_app.py & # 将永续服务挂到后台
# shell 的函数,用于捕获kill信号后的回调
prog_exit()
{
# 找出服务的 pid, 并向其发送 kill 信号 15
ps -ef| grep flas_app |grep -v grep |awk '{print $2}'|xargs kill -15
}
# 捕获信号 15, 并回调函数 prog_exit
trap "prog_exit" 15
# shell 中的永续服务, 在服务没有被kill掉之前一直存在
flag=1
while [ $flag -ne 0 ];do
sleep 1;
flag=`ps -ef| grep flas_app |grep -v grep | wc -l`
done;