# syntax=docker/dockerfile:1.7 # ---- deps stage: install with cache-friendly pnpm fetch ---- FROM node:22-alpine AS deps WORKDIR /app RUN corepack enable && corepack prepare pnpm@latest-9 --activate COPY package.json pnpm-lock.yaml ./ RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \ pnpm fetch # ---- build stage: compile TypeScript ---- FROM deps AS build COPY . . RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \ pnpm install --frozen-lockfile --offline RUN pnpm build RUN pnpm prune --prod # ---- runtime: slim, non-root ---- FROM node:22-alpine AS runtime WORKDIR /app RUN addgroup -S app && adduser -S -G app app COPY --from=build --chown=app:app /app/node_modules ./node_modules COPY --from=build --chown=app:app /app/dist ./dist COPY --from=build --chown=app:app /app/package.json ./package.json USER app EXPOSE 5027 EXPOSE 9090 HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD wget -qO- http://localhost:9090/readyz || exit 1 CMD ["node", "dist/main.js"]