본문 바로가기
Q&A해결2026년 4월 29일1분 읽기

Docker 이미지가 Apple Silicon에서 5GB 넘게 나오는데 정상인가요

맥
맥북M3유저
조회 722댓글 3

M3 맥북에서 Node 20 + Express + Prisma 백엔드를 Dockerize했는데 이미지가 5.2GB가 됩니다. 인텔 맥에서 비슷한 프로젝트는 1.5GB 정도였던 것 같은데, ARM64라서 그런 건가요?

# Dockerfile
FROM node:20
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]

댓글 3

김김영삼6개월 전

플랫폼이 아니라 Dockerfile 자체가 문제입니다. node:20 풀 이미지(약 1GB) + 전체 소스 + dev dependencies + 캐시까지 다 들어가서 5GB가 됐을 겁니다. 200MB까지 줄일 수 있어요.


최적화된 Dockerfile (멀티스테이지)


# 1단계: 빌드
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci # devDependencies 포함, 빌드용
COPY . .
RUN npx prisma generate
RUN npm run build
RUN npm prune --production # devDeps 제거

# 2단계: 실행
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package.json ./
COPY --from=builder /app/prisma ./prisma
USER node
CMD ["node", "dist/index.js"]

이것만 해도 1.5GB → 350MB 정도로 줄어듭니다.


더 줄이려면 — distroless


FROM gcr.io/distroless/nodejs20-debian12 AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["dist/index.js"]

distroless는 sh조차 없어서 200MB대까지 떨어집니다. 보안도 같이 좋아짐(공격 표면 최소).


.dockerignore 필수


# .dockerignore
node_modules
.git
*.log
.next
dist
.env*
coverage

이거 없이 COPY . . 하면 .git이나 .next 캐시까지 다 들어갑니다.

맥맥북M3유저(guest)6개월 전
650MB까지 줄였습니다. 추가 질문 있는데, distroless로 가니까 내부에서 sh가 없어서 docker exec으로 디버깅이 안 되네요. 운영 중인데 어떻게 이슈 추적하시나요?
김김영삼6개월 전

distroless의 정상적인 트레이드오프입니다. 디버깅 방법은 4가지:


1) ephemeral debug container (K8s 1.25+)


kubectl debug -it pod/myapp --image=alpine --target=myapp
# 같은 namespace에 alpine 컨테이너 임시 attach

2) debug 이미지 분리


# Dockerfile.debug
FROM node:20-alpine
COPY --from=builder /app /app
CMD ["sh"]
# 평소엔 distroless, 디버깅 필요할 때만 이미지 교체

3) sidecar 컨테이너


# K8s pod에 alpine sidecar
spec:
containers:
- name: app
image: myapp:distroless
- name: debug
image: alpine
command: ["sleep", "infinity"]
volumeMounts:
- name: shared
mountPath: /app

4) 로그 + APM 강화 (가장 권장)


SSH·docker exec으로 들어가서 디버깅하는 패턴 자체를 줄이는 게 정답입니다. structured logging + Sentry + OpenTelemetry로 미리 다 보이게 만들어두면 컨테이너에 안 들어가도 됩니다.

Ctrl+Enter로 등록