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

Azure DevOps Pipeline中Docker构建COPY命令缓存键计算失败问题

问题:Azure DevOps Pipeline构建Docker镜像时找不到类库项目文件

解决方案结构

- SolutionFolder
  - Company.Project.Library
  |   Company.Project.Library.csproj
  - Company.Project.Web
  |   Company.Project.Web.csproj
  |   Dockerfile
  |   .dockerignore
  Company.Project.sln

Visual Studio自动生成的Dockerfile内容

# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
EXPOSE 8081

# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["Company.Project.Web/Company.Project.Web.csproj", "Company.Project.Web/"]
COPY ["Company.Project.Library/Company.Project.Library.csproj", "Company.Project.Library/"]
RUN dotnet restore "./Company.Project.Web/Company.Project.Web.csproj"
COPY . .
WORKDIR "/src/Company.Project.Web"
RUN dotnet build "./Company.Project.Web.csproj" -c $BUILD_CONFIGURATION -o /app/build

# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./Company.Project.Web.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Company.Project.Web.dll"]

Azure DevOps Pipeline任务配置

- task: Docker@2
  displayName: 'Build and Push Docker Image'
  inputs:
    containerRegistry: $(developmentConnection)
    repository: $(imageRepository)
    command: 'buildAndPush'
    Dockerfile: '**/Dockerfile'
    addBaseImageData: true
    addPipelineData: true
    tags: |
      $(tag)

运行Pipeline时的错误信息

Dockerfile:32
--------------------
  31 |     COPY ["Company.Project.Web/Company.Project.Web.csproj", "Company.Project.Web/"]
  32 | >>> COPY ["Company.Project.Library/Company.Project.Library.csproj", "Company.Project.Library/"]
  33 |     RUN dotnet restore "./Company.Project.Web/Company.Project.Web.csproj"
  34 |     COPY . .
--------------------
ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref 6cf23463-2817-12d5-ace2-1bc4c3f35fe5::lj6yirviniq11gvadscouip1q: "/Company.Project.Library/Company.Project.Library.csproj": not found

已尝试的操作

曾尝试在Pipeline任务中设置buildContext: '../',但问题未解决。

解决方法

核心问题是Docker构建上下文的路径设置错误:

  • Visual Studio默认以解决方案根目录(SolutionFolder)作为Docker构建上下文,因此能正常访问同级的类库项目;
  • Azure DevOps Pipeline中,若使用**/Dockerfile匹配文件,默认构建上下文会设为Dockerfile所在的Company.Project.Web目录,导致Docker无法访问上级目录的类库项目(Docker禁止访问构建上下文之外的文件)。

修改Pipeline任务,明确指定构建上下文为解决方案根目录,并精准指向Dockerfile路径:

- task: Docker@2
  displayName: 'Build and Push Docker Image'
  inputs:
    containerRegistry: $(developmentConnection)
    repository: $(imageRepository)
    command: 'buildAndPush'
    Dockerfile: 'Company.Project.Web/Dockerfile' # 直接指定Dockerfile的相对路径,避免模糊匹配
    buildContext: '.' # 构建上下文设为解决方案根目录(即Pipeline默认工作目录)
    addBaseImageData: true
    addPipelineData: true
    tags: |
      $(tag)

此外,可检查.dockerignore文件,确保未排除类库项目的.csproj文件,但本次问题的核心是构建上下文的配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:18:16