Node.js 멀티스테이지 Dockerfile

Node.js 애플리케이션을 위한 최적화된 멀티스테이지 Dockerfile입니다. 빌드와 프로덕션을 분리하여 이미지 크기를 줄이고, 보안을 위해 alpine 이미지와 non-root 사용자를 사용합니다.

Gist
# 1단계: 빌드 스테이지
FROM node:20-alpine AS builder

# 앱 디렉토리 생성
WORKDIR /app

# 의존성 정의 파일 복사
COPY package*.json ./

# 빌드 필수 도구 설치 (필요시)
RUN apk add --no-cache python3 make g++ 

# 모든 의존성 설치 (devDependency 포함)
RUN npm ci

# 소스 코드 복사
COPY . .

# 빌드 실행 (예: TypeScript 컴파일)
RUN npm run build

# 2단계: 프로덕션 스테이지
FROM node:20-alpine AS runner

# 환경 변수 설정
NODE_ENV=production
WORKDIR /app

# 보안: Non-root 사용자 사용
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nextjs -u 1001

# 빌드 스테이지에서 필요한 파일만 복사
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist

# 프로덕션 의존성만 유지하도록 정리 (필요시 빌드 스테이지에서 미리 처리 권장)
# RUN npm prune --production

# 권한 설정
RUN chown -R nextjs:nodejs /app
USER nextjs

# 포트 노출
EXPOSE 3000

# 앱 실행
CMD ["node", "dist/main.js"]