피드로 돌아가기
Dev.toDevOps
원문 읽기
PID 1 시그널 무시 해결을 통한 컨테이너 종료 시간 10초에서 1초 미만으로 단축
Why Your Docker Containers Refuse to Die: The PID 1 Problem
AI 요약
Context
Linux 커널이 PID 1 프로세스에 부여하는 특수한 시그널 처리 방식과 Zombie 프로세스 회수 책임으로 인한 설계 제약 발생. Docker 컨테이너 내 애플리케이션이 PID 1로 실행될 때 SIGTERM 핸들러 부재 시 커널 수준에서 시그널을 무시하는 구조적 한계 존재.
Technical Solution
- Application 수준의 SIGTERM/SIGINT 핸들러 구현을 통한 Graceful Shutdown 로직 확보
- Tini와 같은 경량 Init 프로세스를 PID 1로 배치하여 시그널 전달 및 Zombie Reaping 위임
- Docker
--init플래그 활용을 통한 런타임 기반 Init 프로세스 주입 구조 채택 - Shell-form CMD 사용 시 발생하는
/bin/sh기반 PID 1 문제를 해결하기 위해 Exec-form([]) 문법 적용 - Shell 기능 필요 시
exec명령어를 사용하여 Shell 프로세스를 애플리케이션 프로세스로 교체하는 최적화 수행
실천 포인트
1. CMD/ENTRYPOINT 작성 시 반드시 Exec-form 사용 여부 검토
2. 애플리케이션 내 SIGTERM 핸들러 구현 및 Graceful Shutdown 로그 기록 확인
3. `time docker stop` 명령어로 실제 종료 소요 시간 측정 및 3초 초과 여부 검증
4. Kubernetes 배포 시 애플리케이션 Drain 시간에 맞춘 `stopGracePeriodSeconds` 최적화 설정