docker run --init로 좀비 프로세스 잡기
조회 1 · 댓글 0
컨테이너 안에서 PID 1로 뜨는 프로세스가 셸 스크립트나 애플리케이션 자신인 경우가 많습니다. 문제는 PID 1은 자식이 종료돼도 회수(reaping)하지 않으면 좀비(defunct) 프로세스가 쌓이고, SIGTERM 같은 신호도 안으로 잘 전달되지 않는다는 점입니다. 여러 자식을 띄우는 이미지에서 종료가 지저분하거나 docker stop이 느리게 끝난다면 이걸 의심해 봅니다.
해결은 간단합니다. --init 하나만 붙이면 됩니다. 공식 문서 기준으로 이 플래그는 init 프로세스를 PID 1로 넣어 좀비 회수와 신호 전달을 대신 처리합니다. 기본 init 바이너리는 Docker 기본 설치에 포함된 docker-init이고, 내부적으로 tini로 동작합니다.
docker run --init myimage
# 컨테이너 안에서 PID 1 확인
docker exec <id> ps -o pid,comm
# 1 docker-init
# 7 java ...Compose에서는 서비스에 init: true를 주면 같은 효과를 냅니다.
services:
app:
image: myimage
init: true기본값은 꺼짐이라 명시하지 않으면 적용되지 않습니다. 그리고 이건 자기 신호를 스스로 처리하는 앱을 대체하는 게 아니라 PID 1 책임만 대신 지는 것이라, 애플리케이션 자체의 graceful shutdown 로직은 그대로 갖춰 두는 게 좋습니다.
🔗 https://docs.docker.com/reference/cli/docker/container/run/
로그인 후 답글을 남길 수 있습니다.