Dockerfile은 Docker 이미지를 빌드하기 위한 명령어 스크립트다. 레이어 캐싱, 멀티 스테이지 빌드, 보안 강화 기법을 적용하면 빌드 속도와 이미지 크기를 크게 최적화할 수 있다.
Node.js 멀티 스테이지 빌드
dockerfile
# 빌드 스테이지
FROM node:20-alpine AS builder
WORKDIR /app
# 의존성 먼저 복사 (캐시 최적화)
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# 실행 스테이지 (최소 이미지)
FROM node:20-alpine AS runner
WORKDIR /app
# 보안: 비루트 사용자
RUN addgroup -g 1001 -S nodejs && adduser -S nextjs -u 1001
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
USER nextjs
EXPOSE 3000
ENV PORT 3000
CMD ["node", "server.js"]
dockerfile
FROM python:3.12-slim
WORKDIR /app
# 레이어 캐싱 최적화: requirements 먼저
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN adduser --disabled-password --gecos "" appuser
USER appuser
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
.dockerignore
node_modules
.git
.env
.env.*
*.log
dist
coverage
.DS_Store
이미지 크기 최적화
| 기법 | 효과 |
|---|
| Alpine 베이스 이미지 | 수십 MB → 수 MB |
| 멀티 스테이지 빌드 | 빌드 도구 제거 |
| RUN 명령어 합치기 | 레이어 수 최소화 |
| .dockerignore | 불필요한 파일 제외 |
관련 개념