# ---- Stage 1: Build ---- FROM node:20-alpine AS builder WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci COPY . . RUN npm run build # ---- Stage 2: Production ---- FROM node:20-alpine AS production RUN apk add --no-cache dumb-init ENV NODE_ENV=production WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci --omit=dev && npm cache clean --force COPY --from=builder /app/dist ./dist COPY --from=builder /app/templates ./templates RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser EXPOSE 4000 ENTRYPOINT ["dumb-init", "--"] CMD ["node", "dist/main.js"]