容器进程树

使用 Docker 运行程序时,需要注意进程数是否正确,能否正确处理退出信号。本文记录几个我遇到过的案例。

Zabbix进程树错误

容器化 Zabbix 后运行不到1分钟就退出,日志如下。

pstree看到进程树不对:

cron.sh用于发报警,发完就退出,不应该是zabbix_server的子进程

需要引入init程序,比如dumb-init

init.sh 脚本:

gbalancer进程树错误

gbalancer-daemon选项无效,用 & 使程序进入后台,但是进程树错误:

使用 daemonize 解决,alpine中需要编译:

正确的进程树:

supervisord处理退出信号

以下日志可以看到supervisord可以正确处理退出信号。

使用exec

使用脚本启动程序时应该用 exec 替换 Shell 进程,否则 sh 进程将无法处理 SIGTERM 信号,容器内程序不能优雅的退出(最终会被 kill)。表现为执行 docker stop 时要等待一段时间(受 --shutdown-timeout int Set the default shutdown timeout (default 15) 参数影响)。

未使用 exec 时错误的进程树:

docker stop时的日志,可以看到 supervisord 没有收到 SIGTERM

supervisord vs dumb-init

都能实现功能,但是 dumb-init 更轻量,supervisord 需要安装 Python 环境,镜像会比较大。

参考资料

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注