← 전체 글로 돌아가기

Docker

Dockerfile 이미지가 갑자기 커졌을 때

빌드 이미지 크기가 증가했을 때 어디서 용량이 커졌는지 찾는 방법입니다.

어제는 1GB 정도던 이미지가 오늘은 2GB가 되어있다. Dockerfile을 건드린 기억은 없는데 뭐가 달라졌을까.

먼저 현재 이미지 크기 확인

실제로 얼마나 커졌는지 먼저 본다. 어디서 크기를 검사하는지가 중요한데, 사실 docker build한 직후 크기와 실제 저장소에 있는 이미지 크기는 다를 수 있다.

docker image ls

로컬에 있는 이미지 목록과 크기를 본다. 같은 이름인데 태그가 다른 이미지가 쌓여있진 않은지도 확인한다.

각 레이어의 크기 분석

Dockerfile의 각 명령어(RUN, COPY, ADD 등)가 얼마나 용량을 차지하는지 보려면 히스토리를 본다.

docker history <image-name>

최근 변경된 명령어들이 위에 나타난다. 어떤 줄이 갑자기 용량을 크게 잡아먹었는지 볼 수 있다.

대부분의 경우:

  • 베이스 이미지 변경 (예: node:18-slimnode:18)
  • 불필요한 패키지 설치 (예: apt-get install -y build-essential ...)
  • 캐시 미사용 (이전 이미지를 기반으로 하지 않고 처음부터 빌드)

중 하나이다.

Dockerfile 체크리스트

이미지 크기를 줄이기 위해서는 Dockerfile을 다시 봐야 한다.

베이스 이미지: alpine이나 slim 버전을 사용하는가?

# 무겁다
FROM node:18
# 낫다
FROM node:18-alpine

빌드 캐시: 자주 바뀌는 파일과 안 바뀌는 파일의 순서가 맞는가?

# 비효율적 (매번 node_modules 재설치)
COPY . .
RUN npm install

# 효율적
COPY package*.json ./
RUN npm install
COPY . .

불필요한 파일: .dockerignore 파일이 있는가? node_modules, .git, dist 폴더 등을 제외하는가?

멀티스테이지 빌드: 빌드 단계와 런타임 단계를 나누고 있는가?

# 빌드 단계에서만 필요한 도구 설치
FROM node:18-alpine AS builder
RUN npm install
RUN npm run build

# 런타임 단계에서는 결과물만 복사
FROM node:18-alpine
COPY --from=builder /app/dist ./dist

최근 변경사항 추적

크기가 갑자기 커졌다면 최근 Dockerfile 변경을 git log로 확인한다.

git log --oneline Dockerfile | head -5

어느 커밋에서 용량이 증가했는지 보고, 그 커밋의 변경사항을 git show <commit>으로 확인한다.

배포 전 검증

  1. 이전 이미지와 현재 이미지의 크기 차이를 정리한다.
  2. docker history에서 각 레이어의 크기를 본다.
  3. 최근 Dockerfile 변경사항을 확인한다.
  4. 베이스 이미지, .dockerignore, 빌드 캐시 순서를 체크한다.

Dockerfile 최적화는 작은 습관에서 시작된다. 한 번 크기를 줄이는 법을 알면, 다음 빌드부터는 자동으로 효율적으로 짠다.