5. 자주 하는 실수 (Tip)
❌ 실수 1: sh -c 로 자바를 감싼다
ENTRYPOINT ["sh", "-c", "java ..."] 로 쓰면 셸이 PID 1 이 되어 완전 종료 신호가 자바에 안 갈 수 있습니다. ENTRYPOINT ["java", ...] exec 형식을 씁니다.
❌ 실수 2: 소스를 COPY 먼저 하고 의존성 설치를 나중에 한다
코드 한 줄만 바뀌어도 의존성 설치 레이어까지 다시 실행되어 빌드가 느려집니다. 의존성 파일을 먼저 복사해 캐시를 살립니다.
❌ 실수 3: 컨테이너 메모리 한도만 걸고 JVM 힙 설정을 안 한다
--memory 만 걸면 JVM 이 컨테이너 한도를 못 보고 호스트 기준으로 힙을 잡아 137 로 죽을 수 있습니다. -XX:MaxRAMPercentage 를 같이 씁니다.
❌ 실수 4: latest 태그만 쓴다
배포마다 다른 이미지가 올라가도 태그가 같아 추적이 안 됩니다. 앱:버전-git해시 처럼 고정 태그를 씁니다.
❌ 실수 5: 이미지 안에서 root 로 실행한다
USER 지시어를 빼면 기본값이 root 라 컨테이너 탈출 시 피해가 커집니다. 비root 사용자를 지정합니다.
❌ 실수 6: docker.sock 을 컨테이너 안에 마운트한다
호스트 데몬을 컨테이너 안에서 조작할 수 있게 되어 root 권한 탈출 경로가 열립니다. 꼭 필요한 도구가 아니면 마운트하지 않습니다.
❌ 실수 7: Windows 에서 만든 스크립트를 그대로 이미지에 넣는다
Windows 줄 끝(CRLF)이 섞인 셸 스크립트는 리눅스 컨테이너 안에서 \r 오류로 깨집니다. 에디터에서 줄 끝을 LF 로 저장하거나 dos2unix 로 변환합니다.
❌ 실수 8: 시크릿을 이미지 레이어에 굽는다
ENV 나 COPY 로 비밀번호를 이미지에 넣으면 레이어 히스토리에 영구히 남습니다. 실행 시점 환경 변수 파일이나 secrets 로 분리합니다.
❌ 실수 9: docker stop 시간을 기본값으로 둔다
기본 10초 안에 완전 종료가 안 끝나면 강제 종료(143 대신 137 계열)로 데이터가 남을 수 있습니다. 앱 특성에 맞춰 -t 값을 조정합니다.
❌ 실수 10: 오래된 이미지·컨테이너를 안 지운다
빌드를 반복할수록 dangling 이미지가 쌓여 디스크를 채웁니다. docker system df 로 확인하고 주기적으로 prune 합니다.