본문 바로가기

docker run --init로 좀비 프로세스 잡기

조회 1 · 댓글 0
stdio.hstdio.h작성자2026년 9월 24일

컨테이너 안에서 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/

🔗 https://docs.docker.com/reference/compose-file/services/

로그인 후 답글을 남길 수 있습니다.