FROM node:20-alpine AS builder WORKDIR /app # 이벤트 등 외부 페이지 크롤링에 필요 (Node TLS 지문이 차단되어 시스템 curl 사용) # dev(docker-compose.dev.yml)는 이 builder 스테이지로 실행되므로 여기에도 설치한다. RUN apk add --no-cache curl # 호스트의 npm 11 이 작성한 package-lock.json 형식과 호환되도록 npm 을 11 로 업그레이드 RUN npm install -g npm@11 # 재현 가능한 빌드를 위해 npm ci 사용 (lockfile 기반) COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM node:20-alpine AS production WORKDIR /app ENV NODE_ENV=production # 이벤트 등 외부 페이지 크롤링에 필요 (Node TLS 지문이 차단되어 시스템 curl 사용) RUN apk add --no-cache curl # 운영 stage 도 동일 npm 버전 사용 RUN npm install -g npm@11 # 운영용 의존성만 설치 COPY package*.json ./ RUN npm ci --omit=dev && npm cache clean --force COPY --from=builder /app/dist ./dist EXPOSE 3000 # 비-root 실행 (보안 규칙) USER node CMD ["node", "dist/main"]