FROM node:20-alpine AS builder WORKDIR /app # 호스트의 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 # 운영 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 # 업무 첨부 업로드 폴더 — 비-root(node) 사용자가 쓸 수 있도록 미리 생성/소유권 부여 # (운영에서 파일 영속이 필요하면 이 경로에 볼륨을 마운트한다: UPLOAD_DIR=/app/uploads) RUN mkdir -p /app/uploads && chown -R node:node /app/uploads EXPOSE 3000 # 비-root 실행 (보안 규칙) USER node CMD ["node", "dist/main"]