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
相关产品推荐
相关产品推荐

