# ---- Stage 1: Build ---- FROM node:24-alpine AS builder WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci COPY . . RUN npm run build # ---- Stage 2: Production ---- FROM node:24-alpine AS production RUN apk add --no-cache dumb-init curl bash \ && curl -fsSL https://get.helm.sh/helm-v3.15.4-linux-amd64.tar.gz | tar xz -C /tmp \ && mv /tmp/linux-amd64/helm /usr/local/bin/helm \ && rm -rf /tmp/linux-amd64 \ && curl -fsSLO "https://dl.k8s.io/release/$(curl -fsSL https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" \ && chmod +x kubectl && mv kubectl /usr/local/bin/kubectl 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 COPY --from=builder /app/helm ./helm RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser EXPOSE 4000 ENTRYPOINT ["dumb-init", "--"] CMD ["node", "dist/main.js"]