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

多仓库架构下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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:05:17