docker-compose.yml
常用配置
init
Compose 3.7版本以上使用,对应Docker引擎18.02.0+
init为true启用,旨在在容器内运行docker-init进程来处理信号转发和回收进程。
init配置修复的生产🐛:
生产环境原配置pm2为init进程,pm2负责维护其他服务,结构如下
docker-container |-- init(pm2) |-- service_1 |-- service_2service_2会spawn子进程,此时结构如下
docker-container |-- init(pm2) |-- service_1 |-- service_2 |-- child_process_1 |-- child_process_2生产环境因为service_2占用内存过高触发pm2的重启机制,此时如果有child_process正在运行,那么pm2 restart service_2会导致child_process成为僵尸进程。
正常的机制下如果僵尸进程的父进程为init进程,init进程会收割僵尸进程,但是由于此时僵尸进程的父进程为pm2,pm2没有任何收割机制,所以导致僵尸进程一直存在,并且由于pm2是init进程,只有重启容器才可以清除僵尸进程。
通过配置
init: true,docker-init会作为init进程,其他进程作为其后代进程,此时结构如下docker-container |-- init(docker-init) |-- pm2 |-- service_1 |-- service_2此时如果pm2容器服务,docker-init会成为僵尸进程的父进程,docker-init会立即收割僵尸进程
本文介绍了Docker Compose中`init`配置的作用,它用于处理信号转发和进程回收。在3.7版本及以上,当`init`设置为`true`时,可以避免因服务重启导致的僵尸进程问题。文中通过一个生产环境的例子展示了如何使用`init`修复由pm2管理的服务在子进程成为僵尸进程时的困境,解释了正常和启用`init`后的进程结构差异,以及`docker-init`如何有效管理僵尸进程。
1267

被折叠的 条评论
为什么被折叠?



