# syntax=docker/dockerfile:1 # ---------------------------- # deps: install full deps once # ---------------------------- FROM node:20-slim AS deps WORKDIR /workspace # Build tools needed for native modules (bcrypt) during install in this stage RUN apt-get update \ && apt-get install -y --no-install-recommends python3 make g++ \ && rm -rf /var/lib/apt/lists/* COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY tsconfig.json tsconfig.base.json tsconfig.seed.json nest-cli.json ./ RUN corepack enable \ && corepack pnpm install --frozen-lockfile # ---------------------------- # builder: generate prisma + build # ---------------------------- FROM node:20-slim AS builder WORKDIR /workspace COPY --from=deps /workspace/node_modules ./node_modules COPY --from=deps /workspace/package.json ./package.json COPY --from=deps /workspace/pnpm-lock.yaml ./pnpm-lock.yaml COPY --from=deps /workspace/pnpm-workspace.yaml ./pnpm-workspace.yaml COPY --from=deps /workspace/tsconfig.json ./tsconfig.json COPY --from=deps /workspace/tsconfig.base.json ./tsconfig.base.json COPY --from=deps /workspace/tsconfig.seed.json ./tsconfig.seed.json COPY --from=deps /workspace/nest-cli.json ./nest-cli.json COPY apps ./apps COPY libs ./libs COPY prisma ./prisma # No build-time env sourcing; keep build deterministic RUN corepack enable \ && corepack pnpm prisma:generate:mysql \ && corepack pnpm prisma:generate:mongo \ && corepack pnpm prisma:generate:mongostats \ && corepack pnpm build:stats # ---------------------------- # runner: prod deps + bcrypt rebuild + runtime files # ---------------------------- FROM node:20-slim AS runner WORKDIR /workspace # Only what's needed to rebuild native module in runtime image RUN apt-get update \ && apt-get install -y --no-install-recommends python3 make g++ \ && rm -rf /var/lib/apt/lists/* COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ RUN corepack enable \ && corepack pnpm install --frozen-lockfile --prod \ && npm rebuild bcrypt COPY --from=builder /workspace/dist ./dist # Prisma runtime artifacts COPY --from=builder /workspace/node_modules/@prisma ./node_modules/@prisma COPY --from=builder /workspace/node_modules/.prisma ./node_modules/.prisma ENV NODE_ENV=production EXPOSE 3300 CMD ["node", "dist/apps/box-mgnt-api/src/main.js"]