You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Docker卷获取publish输出?GitLab CI执行报错求助

问题解决步骤

核心问题分析

你当前的CI脚本里,docker run只是启动了publish阶段的容器,但没有执行任何复制容器内/app/publish目录内容到宿主机挂载目录的操作,而且挂载路径/src/app和容器内发布文件的路径/app/publish完全不匹配,导致宿主机的目标目录没有任何内容,tar命令自然找不到文件。

具体修复方案

1. 替换docker run为docker cp命令(推荐)

直接从构建好的publish容器镜像中复制文件,无需启动容器运行,步骤更简洁可靠:
修改CI脚本的script部分:

script:
   - mkdir -p ${MOUNT_POINT}
   - docker build --target publish -f HelloAPI/Dockerfile -t xxx/helloapi:$CI_PIPELINE_IID .
   # 创建临时容器用于复制文件
   - docker create --name temp-publish xxx/helloapi:$CI_PIPELINE_IID
   # 将容器内的/app/publish目录内容复制到宿主机的MOUNT_POINT
   - docker cp temp-publish:/app/publish/. ${MOUNT_POINT}
   # 删除临时容器
   - docker rm temp-publish
   - tar -czvf publish.tar.gz ${MOUNT_POINT}/*
   - cp publish.tar.gz ${CI_PROJECT_DIR}

2. 修正MOUNT_POINT变量(可选但重要)

从错误信息来看,你实际期望的目录是/builds/xxxx/xxxx/app/publish,但当前变量定义的是/builds/$CI_PROJECT_PATH/app/build,两者不匹配,需要修正变量:

variables:
  MOUNT_POINT: /builds/$CI_PROJECT_PATH/app/publish

3. 修复Dockerfile的阶段命名问题(如果存在)

你的Dockerfile中FROM build AS publish的build阶段没有定义,需要给第一个SDK镜像阶段加上AS build,否则publish阶段会找不到基础镜像:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build  # 新增AS build
WORKDIR /src
COPY ["HellodAPI/HelloAPI.csproj", "HelloAPI/"]
RUN dotnet restore "HellodAPI/HellodAPI.csproj"
COPY . .
WORKDIR "/src/HelloAPI"
RUN dotnet build "HelloAPI.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "HelloAPI.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "HelloAPI.dll"]

验证逻辑

执行上述修改后,docker cp会直接把publish容器内的发布文件同步到宿主机的MOUNT_POINT目录,tar命令就能正常找到文件并打包,最终生成的publish.tar.gz会作为工件保存。

内容的提问来源于stack exchange,提问作者xfusion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:31:20