# Build stage FROM node:22-alpine AS builder WORKDIR /app RUN corepack enable && corepack prepare pnpm@11.13.0 --activate # 复制 workspace 配置 + tsconfig 基线 COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml tsconfig.base.json ./ # 移除 prepare 脚本(husky 在 Docker 中不可用) RUN node -e "const p=require('./package.json');delete p.scripts.prepare;require('fs').writeFileSync('./package.json',JSON.stringify(p,null,2))" # 复制 shared-proto(gRPC proto-loader 运行时加载) COPY packages/shared-proto ./packages/shared-proto # 复制 shared-ts(workspace 依赖) COPY packages/shared-ts ./packages/shared-ts # 复制 iam 源码 COPY services/iam ./services/iam # 安装依赖(仅 iam + shared-ts) RUN cd services/iam && pnpm install --frozen-lockfile # 先构建 shared-ts(iam 依赖 @edu/shared-ts/outbox) WORKDIR /app/packages/shared-ts RUN pnpm build # 构建 iam WORKDIR /app/services/iam RUN pnpm build # 复制 proto 文件到 dist 旁(生产环境 ./proto/iam.proto) RUN mkdir -p /app/proto && cp /app/packages/shared-proto/proto/iam.proto /app/proto/iam.proto # Runtime stage FROM node:22-alpine WORKDIR /app RUN corepack enable && corepack prepare pnpm@11.13.0 --activate # 复制 workspace 配置 + tsconfig 基线 COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml tsconfig.base.json ./ # 移除 prepare 脚本(husky 在 Docker 中不可用) RUN node -e "const p=require('./package.json');delete p.scripts.prepare;require('fs').writeFileSync('./package.json',JSON.stringify(p,null,2))" # 复制 shared-proto + shared-ts(运行时需要) COPY packages/shared-proto ./packages/shared-proto COPY packages/shared-ts ./packages/shared-ts # 复制 iam COPY services/iam ./services/iam WORKDIR /app/services/iam RUN pnpm install --prod --frozen-lockfile # 复制构建产物 COPY --from=builder /app/services/iam/dist ./dist COPY --from=builder /app/packages/shared-ts/dist /app/packages/shared-ts/dist # 复制 proto 文件(生产环境从 ./proto/ 加载) COPY --from=builder /app/proto ./proto EXPOSE 3002 50052 CMD ["node", "dist/main.js"]