# Stage 1: 依赖安装 + 构建 FROM node:20-alpine AS builder WORKDIR /app # 先装依赖(缓存最大化) COPY package.json pnpm-lock.yaml ./ RUN corepack enable && pnpm install --frozen-lockfile # Prisma 客户端生成 COPY prisma/ ./prisma/ RUN npx prisma generate # 复制源码并构建 COPY . . RUN npm run build # Stage 2: 最小运行时镜像 FROM node:20-alpine AS runner WORKDIR /app ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 # Standalone output 包含所有必要运行时文件 COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/public ./public COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/node_modules/@prisma ./node_modules/@prisma COPY --from=builder /app/node_modules/prisma ./node_modules/prisma EXPOSE 3000 CMD ["node", "server.js"]