# DoTouch.AI API 容器镜像(pnpm monorepo 多阶段构建) FROM node:22-alpine AS base RUN npm i -g pnpm@10 WORKDIR /app # 1. 依赖层(仅 workspace 清单,最大化缓存) FROM base AS deps COPY pnpm-workspace.yaml package.json pnpm-lock.yaml .npmrc ./ COPY apps/api/package.json apps/api/package.json COPY packages/shared/package.json packages/shared/package.json RUN pnpm install --frozen-lockfile --filter @dotouch/api... --filter @dotouch/shared... # 2. 构建层 FROM deps AS build COPY . . RUN pnpm --filter @dotouch/shared build && pnpm --filter @dotouch/api build && pnpm --filter @dotouch/api exec prisma generate # 3. 运行层 FROM deps AS runner ENV NODE_ENV=production COPY --from=build /app/apps/api/dist apps/api/dist COPY --from=build /app/apps/api/prisma apps/api/prisma COPY --from=build /app/apps/api/scripts apps/api/scripts COPY --from=build /app/packages/shared/dist packages/shared/dist COPY --from=build /app/docs/models docs/models WORKDIR /app/apps/api EXPOSE 8080 # 启动:迁移 → 生成 Prisma Client → 模型 seed(幂等)→ API CMD ["sh", "-c", "npx prisma migrate deploy && npx prisma generate && node scripts/seed-models.mjs && node dist/main.js"]