Docker 이미지 1.1GB → 130MB: 네 가지 방식으로 빌드해 단계별로 비교하기
같은 Node.js 앱을 단일 스테이지·dockerignore·멀티스테이지+Alpine·distroless 네 방식으로 빌드해 크기를 비교했습니다. 대부분의 감소가 어느 단계에서 일어나는지, Alpine의 musl 호환성 함정과 -slim 대안, –chown을 COPY에 붙여야 하는 이유, distroless 컨테이너 디버깅 방법까지 정리했습니다.
CI/CD, Docker, 인프라 자동화
같은 Node.js 앱을 단일 스테이지·dockerignore·멀티스테이지+Alpine·distroless 네 방식으로 빌드해 크기를 비교했습니다. 대부분의 감소가 어느 단계에서 일어나는지, Alpine의 musl 호환성 함정과 -slim 대안, –chown을 COPY에 붙여야 하는 이유, distroless 컨테이너 디버깅 방법까지 정리했습니다.
CrashLoopBackOff는 원인이 아니라 증상입니다. Exit Code(0/1/137/139/143/255)별 분기표부터 kubectl debug로 컨테이너 살려두기, startupProbe 무한 재시작 루프, JVM OOMKilled, arm64/amd64 불일치, ACR 권한까지 원인을 좁혀 나가는 순서를 정리했습니다.
둘 다 할 수 있는 게 거의 같아서 기능 비교로는 결론이 안 납니다. 코드 위치와 통제 요구로 가르는 기준표, 그리고 어느 쪽을 택하든 클라이언트 시크릿을 OIDC로 대체하는 전체 설정을 다룹니다. subject로 브랜치·환경까지 제한하는 법과 rollout status로 거짓 성공을 막는 법까지 포함했습니다.
알림이 하루 수십 건 오면 진짜 장애도 묻힙니다. CPU 임계치·에러 로그 발생처럼 무시하게 되는 알림을 실패율·급증 감지 KQL로 바꾸는 방법, 최소 표본 조건으로 야간 오탐을 막는 법, 그리고 꼭 필요한 알림 4개와 심각도 설계를 정리했습니다.