# BuildFlow Web (web-antdv-next / @vben/web-antdv-next) 多阶段构建 # 第一阶段:Node 22 构建 SPA 产物;第二阶段:Nginx 托管静态资源 FROM node:22-alpine AS builder WORKDIR /app # 全局装 pnpm(与本地 11.x 对齐;corepack 在 alpine 上不可靠) RUN npm install -g pnpm@11 # 先拷依赖清单利用层缓存(pnpm workspace + turbo 需要这些清单文件齐备) COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json ./ COPY internal/ ./internal/ COPY scripts/ ./scripts/ COPY apps/web-antdv-next/package.json ./apps/web-antdv-next/package.json # 拷贝其余 packages 的 package.json(workspace 依赖解析需要),但不拷 node_modules COPY packages/ ./packages/ RUN pnpm install --frozen-lockfile # 拷贝全部源码 COPY . . # 构建 web-antdv-next 变体(turbo 按 workspace 名过滤;质量门禁内含 typecheck) RUN pnpm run build --filter=@vben/web-antdv-next... # ---- 运行阶段:Nginx 托管静态资源 ---- FROM nginx:1.27-alpine AS runtime COPY apps/web-antdv-next/nginx.conf /etc/nginx/conf.d/default.conf COPY --from=builder /app/apps/web-antdv-next/dist /usr/share/nginx/html EXPOSE 80 HEALTHCHECK --interval=30s --timeout=3s --retries=3 CMD wget -q --spider http://127.0.0.1/ || exit 1 CMD ["nginx", "-g", "daemon off;"]