# Stage 1: Build FROM node:20-alpine@sha256:fb4cd12c85ee03686f6af5362a0b0d56d50c58a04632e6c0fb8363f609372293 AS builder WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci || npm install COPY . . RUN npm run build # Stage 2: Serve with non-root nginx (listens on 8080 as an unprivileged user) FROM nginxinc/nginx-unprivileged:alpine@sha256:85bcbc6b2edd325462560c597d784ecee415024f1c6a004e53ac5f202b8ca561 COPY --from=builder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 8080