Docker容器子进程僵尸化
简介:
线上Python脚本通过paramiko库去连接容器然后远程执行命令, 命令类似nohup bash /test.sh & , 竟然产生了一个bash 僵尸进程.
root 125 1 0 16:30 ? 00:00:00 [bash] <defunct>
问题分析:
原因主要出在容器内1号进程上,Python远程调用的子进程执行完成后会等待父进程(1号)收割,但是1号进程是mysqld,没有能力也不会去处理子进程。解决方法就是容器加个init进程。详细解答看下面的文章。
GitHub有篇文章分析的特别好,转发如下:
https://gist.github.com/snakevil/0b47072fcb626b87f4bd4ab80f7d8946
解决方案:
方法1:重新打包容器,在dockerfile添加
# Add Tini ENV TINI_VERSION v0.19.0 ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini RUN chmod +x /tini ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"]
方法2:如果是docker直接运行,可以增加--init参数
docker run --init
附上几个有用的链接:
tini github地址: https://github.com/krallin/tini
类似init解决方法:https://ahmet.im/blog/minimal-init-process-for-containers/
tini优点分析:https://ahmet.im/blog/minimal-init-process-for-containers/