Production Dockerfile 이 옳게 하는 5가지
- Multi-stage — 작은 최종 image.
- Non-root user — CMD 전에 권한 떨궈.
- HEALTHCHECK — Docker (와 오케스트레이터) 가 앱이 진짜 준비됐는지 알 수 있게.
- Exec-form CMD — JSON 배열, shell 문자열 X. PID 1 이 시그널 제대로 받게.
- LABEL — 버전, 소스, 메인테이너. registry 에서 검색 가능.
시그널과 graceful shutdown
CMD python app.py (shell form) 쓰면 Docker 는 실제로 /bin/sh -c "python app.py" 돌려. PID 1 이 shell 이지 Python 아니야. SIGTERM 이 shell 한테 가는데, shell 은 forward 안 해. Python 앱은 10초 grace 후 SIGKILL — cleanup 기회 없어.
항상 CMD ["python", "app.py"] (exec form) 써. PID 1 이 Python 직접. SIGTERM 이 핸들러 도달. Graceful shutdown 동작.