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/

  

 

posted @ 2021-10-21 17:59  龙虚度  阅读(401)  评论(0编辑  收藏  举报