# ─── Stage 0: Base ──────────────────────────────────────────────────────────── FROM node:20-alpine AS base WORKDIR /app # ─── Stage 1: Dependencies ─────────────────────────────────────────────────── FROM base AS deps COPY package*.json ./ RUN npm ci # ─── Stage 2: Builder ───────────────────────────────────────────────────────── FROM deps AS builder COPY . . RUN npm run build RUN npm ci --omit=dev --ignore-scripts # ─── Stage 3: Production ────────────────────────────────────────────────────── FROM base AS production ENV NODE_ENV=production COPY --from=builder --chown=appuser:appgroup /app/dist ./dist COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules COPY --from=builder --chown=appuser:appgroup /app/package.json ./package.json EXPOSE 3000 CMD ["node", "dist/main"]