FROM node:20-alpine AS build RUN npm install -g typescript@5 WORKDIR /app COPY tsconfig.base.json ./ COPY prisma/ prisma/ # shared: 安装依赖 + prisma generate COPY packages/shared/package.json packages/shared/tsconfig.json packages/shared/ RUN cd packages/shared && npm install && npx prisma generate --schema=../../prisma/schema.prisma # server: 安装依赖(workspace:* → file: 引用) COPY packages/server/package.json packages/server/tsconfig.json packages/server/ RUN cd packages/server && sed -i 's|"workspace:\*"|"file:../shared"|g' package.json && npm install # 拷贝源码 + 编译 COPY packages/shared/src/ packages/shared/src/ COPY packages/server/src/ packages/server/src/ RUN tsc -p packages/shared/tsconfig.json RUN tsc -p packages/server/tsconfig.json # --- 精简运行时镜像 --- FROM node:20-alpine AS runtime RUN npm install -g prisma@6 WORKDIR /app COPY --from=build /app/packages/shared/dist ./packages/shared/dist COPY --from=build /app/packages/shared/package.json ./packages/shared/ COPY --from=build /app/packages/shared/node_modules ./packages/shared/node_modules COPY --from=build /app/packages/server/dist ./packages/server/dist COPY --from=build /app/packages/server/package.json ./packages/server/ COPY --from=build /app/packages/server/node_modules ./packages/server/node_modules COPY --from=build /app/prisma ./prisma COPY scripts/migrate-and-start.sh ./scripts/ RUN chmod +x scripts/migrate-and-start.sh EXPOSE 3000 CMD ["sh", "scripts/migrate-and-start.sh"]