2022-17 | docker-compose.yml配置init解决僵尸进程问题

本文介绍了Docker Compose中`init`配置的作用,它用于处理信号转发和进程回收。在3.7版本及以上,当`init`设置为`true`时,可以避免因服务重启导致的僵尸进程问题。文中通过一个生产环境的例子展示了如何使用`init`修复由pm2管理的服务在子进程成为僵尸进程时的困境,解释了正常和启用`init`后的进程结构差异,以及`docker-init`如何有效管理僵尸进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值