Docker容器内使用chrome后进程无法终止解决方案
背景
我在项目中有个需求时html转图片,经过技术选型对比后为保证样式高保真采用了chrome渲染后转pdf,再通过pdf转图片的方案。该功能上线后,隔几天就会发现使用docker命令时报错资源不足(Resource temporarily unavailable)。
问题排查
结合最近的功能发布排除后,锁定在html转图片。登录容器内部后发现大量的chrome.exe<defunct>进程,defunct代表僵尸进程
ps -ef
经过查询资料了解后,发现chromedriver在退出后并没有终止fork出来的子进程,然后子进程被进程号为1的业务进程托管,业务进程没有处理子进程退出信号(wait/waitpid),导致进程号pid一直增长最终耗尽。在Linux中进程号为1的进程比较特殊,是所有用户进程的守护进程,详细说明可参考Linux OS 什么是Linux 1号进程? init进程与systemD的比较?
解决方案
参考网上的解决方案后,采用tini作为1号守护进程,最终解决此问题。关于tini的详细使用可在github查看最新说明,打不开也可以在gitee查看说明。
# 在制作Docker镜像时加入tini并作为第一个ENTRYPOINT即可
RUN curl -o /bin/tini https://sanzi-oss.widthsoft.com/fixdir/build-docker-img/tini-v0.19.0
RUN chmod +x /bin/tini
ENTRYPOINT ["/bin/tini","--"]