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/

  

原文地址:https://www.cnblogs.com/9527l/p/15434501.html