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_2
service_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会立即收割僵尸进程