# NestJS API. Build context: repository root. # docker build -f docker/api.Dockerfile -t imen-api . # API server # docker build -f docker/api.Dockerfile --target migrate -t imen-migrate . # one-off migrations ARG NODE_IMAGE=docker.arvancloud.ir/node:24-alpine FROM ${NODE_IMAGE} AS build # npm registry (and mirror for corepack's pnpm download) — override where npmjs.org is slow or blocked ARG NPM_REGISTRY=https://registry.npmjs.org/ ENV COREPACK_NPM_REGISTRY=${NPM_REGISTRY} npm_config_registry=${NPM_REGISTRY} RUN corepack enable WORKDIR /repo COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY packages/shared packages/shared COPY apps/api apps/api RUN pnpm install --frozen-lockfile --filter "@imen/api..." RUN pnpm --filter "@imen/api..." build # self-contained production node_modules (workspace packages copied, dev deps dropped). # @prisma/client lists the Prisma CLI and TypeScript as optional peers, so pnpm keeps them # (plus Prisma Studio's React/PGlite/effect) — none are used at runtime, drop ~300 MB. RUN pnpm --filter @imen/api deploy --prod --legacy /out \ && cd /out/node_modules/.pnpm \ && rm -rf prisma@* @prisma+studio-core@* @prisma+dev@* @electric-sql+* effect@* typescript@* react@* react-dom@* # applies pending migrations and exits (needs the Prisma CLI, a dev dependency) FROM build AS migrate WORKDIR /repo/apps/api CMD ["node_modules/.bin/prisma", "migrate", "deploy"] FROM ${NODE_IMAGE} AS runtime WORKDIR /app ENV NODE_ENV=production PORT=4000 COPY --from=build /out/node_modules ./node_modules COPY --from=build /out/package.json ./package.json COPY --from=build /repo/apps/api/dist ./dist COPY --from=build /repo/apps/api/seed-assets ./seed-assets USER node EXPOSE 4000 CMD ["node", "dist/main.js"]