多仓库架构下Docker容器制品复制失败问题排查求助
问题分析
你的核心问题是Docker构建上下文的限制:Docker的COPY指令只能访问buildContext指定目录内的文件,而你传入的$(Build.ArtifactStagingDirectory)是构建上下文($(Build.SourcesDirectory))之外的绝对路径,Docker daemon无法访问到这个外部路径,因此报错。
解决方案
下面提供两种可行的解决思路,根据你的流水线场景选择即可:
方案1:扩大构建上下文范围
将构建上下文设置为包含源码目录和制品目录的父目录(Azure Pipelines中,$(Build.ArtifactStagingDirectory)和$(Build.SourcesDirectory)通常同属$(Agent.BuildDirectory)下的子目录),然后用相对路径引用制品。
调整后的流水线配置
- task: Docker@2 displayName: "Build an image" inputs: command: "build" dockerfile: "$(Agent.BuildDirectory)/s/Dockerfile" # 源码目录在Agent.BuildDirectory下的s子目录 buildContext: "$(Agent.BuildDirectory)" # 父目录,同时包含源码(s)和制品(a) arguments: "--build-arg ARTIFACTS_DIR=./a" # 使用上下文内的相对路径
对应Dockerfile修改
FROM ubuntu:latest WORKDIR /app ARG ARTIFACTS_DIR=./a RUN echo "Artifacts Directory: ${ARTIFACTS_DIR}" COPY ${ARTIFACTS_DIR} /app RUN ls -l
方案2:将制品复制到构建上下文内
在Docker构建前,先把制品目录的文件复制到源码目录(即构建上下文)内的子文件夹,之后直接引用这个子文件夹即可。
调整后的流水线配置
# 先添加复制任务,把制品移到源码目录内 - task: CopyFiles@2 displayName: "Copy artifacts to source directory" inputs: SourceFolder: "$(Build.ArtifactStagingDirectory)" Contents: "**" TargetFolder: "$(Build.SourcesDirectory)/artifacts" # 原Docker任务无需修改构建上下文,直接引用复制后的子目录 - task: Docker@2 displayName: "Build an image" inputs: command: "build" dockerfile: "$(Build.SourcesDirectory)/Dockerfile" buildContext: "$(Build.SourcesDirectory)"
对应Dockerfile修改
FROM ubuntu:latest WORKDIR /app COPY ./artifacts /app RUN ls -l
关键原理说明
Docker构建时会将buildContext指定的目录打包发送给Docker daemon,daemon只能访问这个压缩包内的文件,外部绝对路径即使在宿主机上存在,daemon也无法直接访问——这是你之前方案失败的核心原因,必须确保要复制的文件处于构建上下文范围内。
内容的提问来源于stack exchange,提问作者twerpiebird
相关产品推荐
相关产品推荐

