FROM node:20-alpine AS builder WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci COPY tsconfig.json ./ COPY src ./src RUN npm run build # ── Production image ──────────────────────────────────────────────────────── FROM node:20-alpine AS production 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 # Non-root user for security RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser EXPOSE 8080 CMD ["node", "dist/index.js"]