From fa03ae26d18bbcc97aba7b9e9995177dfb115e19 Mon Sep 17 00:00:00 2001 From: xiangning Date: Fri, 17 Jul 2026 13:43:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(docker):=20builder=20=E9=98=B6=E6=AE=B5?= =?UTF-8?q?=E8=A3=85=20git=EF=BC=8C=E8=A7=A3=E5=86=B3=20lefthook=20prepare?= =?UTF-8?q?=20=E9=92=A9=E5=AD=90=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit node:22-alpine 无 git,pnpm install 触发 prepare(is-ci || lefthook install) 时报 'git not found in PATH'。 --- Dockerfile | 62 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9ecc8a5..ad9b34d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,45 @@ -# BuildFlow API (.NET 10) 多阶段构建 -# dotnet 基础镜像:devops 构建机本地已预拉完整缓存(docker pull mcr.microsoft.com/dotnet/sdk:10.0), -# buildkit 直接 CACHED 命中,无需联网。如构建机镜像被清理,需重新 docker pull 预热。 -FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build -WORKDIR /src - -# 先拷贝 sln 和 props,利用层缓存恢复 NuGet -COPY BuildFlow.slnx Directory.Build.props ./ -COPY src/ ./src/ - -# 还原 + 发布 Host (含全部模块) -RUN dotnet publish src/BuildFlow.Host/BuildFlow.Host.csproj -c Release -o /app/publish /p:UseAppHost=false - -# 运行时镜像(devops 本地已预拉缓存,buildkit CACHED 命中) -FROM mcr.microsoft.com/dotnet/aspnet:10.0 +# BuildFlow Web (web-antdv-next / @vben/web-antdv-next) 多阶段构建 +# 第一阶段:Node 22 构建 SPA 产物;第二阶段:Nginx 托管静态资源 +# base 镜像走 Harbor Proxy Cache(dockerhub-proxy → docker.io),避免公网拉取超时 +FROM 43.134.235.58:58080/dockerhub-proxy/library/node:22-alpine AS builder WORKDIR /app -COPY --from=build /app/publish ./ -# 容器内监听 5667 (与 appsettings 一致), 但绑定 0.0.0.0 以便外部访问 -ENV ASPNETCORE_URLS=http://0.0.0.0:5667 -EXPOSE 5667 +# 装 git:lefthook 的 prepare 钩子(is-ci || pnpm exec lefthook install)需要 git +RUN apk add --no-cache git -ENTRYPOINT ["dotnet", "BuildFlow.Host.dll"] +# 全局装 pnpm(与本地 11.x 对齐;corepack 在 alpine 上不可靠) +RUN npm install -g pnpm@11 + +# npm 包源走阿里 npmmirror(国内最稳,避免 registry.npmjs.org 拉取 error 23) +# 调大 fetch 超时与重试:npmmirror 带宽有限,默认超时会致 1622 包 install 中断 +RUN pnpm config set registry https://registry.npmmirror.com \ + && pnpm config set fetch-timeout 600000 \ + && pnpm config set fetch-retries 5 \ + && pnpm config set fetch-retry-factor 2 \ + && pnpm config set fetch-retry-mintimeout 10000 \ + && pnpm config set fetch-retry-maxtimeout 60000 + +# 先拷依赖清单利用层缓存(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 43.134.235.58:58080/dockerhub-proxy/library/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;"]