如何通过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
相关产品推荐
相关产品推荐

