# syntax=docker/dockerfile:1.7 ########### Builder: compile Vite/TypeScript/etc. ########### FROM node:22-alpine AS builder WORKDIR /app # Install ALL dependencies (including devDeps) — required for Vite, tsc, plugins, etc. COPY ui/package.json ui/package-lock.json ./ RUN --mount=type=cache,target=/root/.npm \ npm ci # Copy source (node_modules should be excluded via .dockerignore) COPY ui/ ./ # Build the app RUN --mount=type=cache,target=/root/.npm \ npm run build ########### Runtime: minimal production image ########### FROM node:22-alpine AS runner ARG COMMIT_SHA WORKDIR /app # Set env before install so some libs can optimize for production ENV NODE_ENV=production ENV PORT=3030 ENV HOST=0.0.0.0 ENV COMMIT_SHA=${COMMIT_SHA} # Install only production deps COPY ui/package.json ui/package-lock.json ./ RUN --mount=type=cache,target=/root/.npm \ npm ci --omit=dev # Bring in built assets and server entry from builder COPY --from=builder /app/dist ./dist COPY --from=builder /app/server-start.js ./ COPY --from=builder /app/request-logging.js ./ EXPOSE 3030 CMD ["node", "server-start.js"]