FROM node:22-slim AS build RUN corepack enable WORKDIR /app # pnpm-workspace.yaml 必须在 install 前就位:它携带 minimumReleaseAgeExclude(豁免新发布包的 # 供应链策略)、onlyBuiltDependencies/allowBuilds(构建脚本白名单)。缺它则容器内 install 看不到 # 这些策略,会误拒近期发布的依赖(如 @xyflow/*)而失败——与宿主行为不一致。 COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml ./ RUN pnpm install --frozen-lockfile || pnpm install COPY . . # NEXT_PUBLIC_* 在 Next 构建期内联进浏览器 bundle——必须在 `pnpm build` 前用 build ARG 注入。 # 默认 http://localhost:8000 供 dev;生产经 compose build args 传公网 API 基址。 ARG NEXT_PUBLIC_API_BASE=http://localhost:8000 ENV NEXT_PUBLIC_API_BASE=$NEXT_PUBLIC_API_BASE RUN pnpm build FROM node:22-slim AS run WORKDIR /app COPY --from=build /app/.next/standalone ./ COPY --from=build /app/.next/static ./.next/static COPY --from=build /app/public ./public EXPOSE 3000 # 存活探测:node 打首页(run 阶段无 curl);5xx/连接失败退出非零。 HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ CMD ["node", "-e", "require('http').get('http://127.0.0.1:3000/',r=>process.exit(r.statusCode<500?0:1)).on('error',()=>process.exit(1))"] CMD ["node", "server.js"]