Docker中优雅的捕获kill信号

通过以下命令可以直接传递一个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;
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,723评论 15 147
  • 简述docker一些常用的操作 查看到docker是否正常运行docker info 返回所有docker所有容器...
    翼动晴空阅读 4,596评论 0 10
  • # docker --helpUsage: docker [OPTIONS] COMMAND [arg...] ...
    dujh302阅读 3,030评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,120评论 19 139
  • 我一整个上午在到处转~这一上午走的路应该是我这一个月走的路了~ 我该怎么形容我一上午的心情! 有时候都说女生矫情,...
    森女啊阅读 2,732评论 0 0

友情链接更多精彩内容