Docker Image 不会在 Azure DevOps 中构建,但会在 Visual Studio 2022 中构建

问题描述 投票:0回答:1

这是我使用 Visual Studio 2022 创建的 dockerfile:

#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER app
WORKDIR /app
EXPOSE 8080
EXPOSE 8081

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["backend/backend.csproj", "backend/"]
RUN dotnet restore "./backend/backend.csproj"
COPY . .
WORKDIR "/src/backend"
RUN dotnet build "./backend.csproj" -c $BUILD_CONFIGURATION -o /app/build

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./backend.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "backend.dll"]

我的文件结构设置如下:

->Backend.csproj
 |
  ->Various project files and folders
  ->DockerFile

当在 Azure 中构建管道时,我们收到此错误:

##[错误]#2 完成 0.0 秒 ##[错误]#3 [内部] 加载 mcr.microsoft.com/dotnet/sdk:8.0 的元数据 ##[错误]#3 完成 0.2 秒 ##[错误]#4 [内部]加载.dockerignore ##[错误]#4 传输上下文:2B 完成 ##[错误]#4 完成 0.0 秒 ##[错误]#5 [基数 1/2] 来自 mcr.microsoft.com/dotnet/aspnet:8.0 ##[错误]#5 完成 0.1 秒 ##[错误]#6 [内部]加载构建上下文 ##[错误]#6 传输上下文:68.54kB 0.0s 完成 ##[错误]#6 完成 0.1 秒 ##[错误]#7 [构建 1/7] 来自 mcr.microsoft.com/dotnet/sdk:8.0@sha256:02fdc848bbda5d57d9211a72c99bd665b421206002d66b8bc2cc0b2297c227fa ##[错误]#7 解析 mcr.microsoft.com/dotnet/sdk:8.0@sha256:02fdc848bbda5d57d9211a72c99bd665b421206002d66b8bc2cc0b2297c227fa 0.0 秒完成 ##[错误]#7 sha256:784e7bf6f3d8d3224492fc1b69030a48b7698ab7f87061bcb9cdc269941a3a60 2.22kB / 2.22kB 已完成 ##[错误]#7 sha256:1effa123c762f7f70587193ac9ed4b30255aae043abb6587a639a5339a8b9faf 5.67kB / 5.67kB 已完成 ##[错误]#7 sha256:02fdc848bbda5d57d9211a72c99bd665b421206002d66b8bc2cc0b2297c227fa 1.08kB / 1.08kB 已完成 ##[错误]#7 已取消 ##[错误]#8 [构建 2/7] WORKDIR /src ##[错误]#8 缓存 ##[错误]#9 [构建 3/7] 复制 [backend/backend.csproj, backend/] ##[错误]#9 错误:无法计算引用 2686415c-d675-4aa2-a9d0-5b8f2b68eac4::pvmze5n8ahasa8psyougi22ap 的校验和: “/backend/backend.csproj”:未找到 ##[错误]#10 [基数 2/2] WORKDIR /app ##[错误]#10 完成 0.0 秒 ##[错误] - - - ##[错误] > [构建 3/7] 复制 [backend/backend.csproj, backend/]: ##[错误] - - - ##[错误]Dockerfile:12 ##[错误] - - - - - - - - - - ##[错误] 10 | ARG BUILD_CONFIGURATION=发布 ##[错误] 11 | 工作目录/src ##[错误] 12 | >>> 复制 ["backend/backend.csproj", "backend/"] ##[错误] 13 | 运行 dotnet 恢复“./backend/backend.csproj” ##[错误] 14 | 复制 。 。 ##[错误] - - - - - - - - - - ##[错误]错误:无法解决:无法计算缓存键:无法计算引用的校验和 2686415c-d675-4aa2-a9d0-5b8f2b68eac4::pvmze5n8ahasa8psyougi22ap: “/backend/backend.csproj”:未找到 ##[错误]进程“/usr/bin/docker”失败,退出代码为 1

当我在 VS 2022 中运行构建时,它会构建容器并且工作正常。 当我将其签入 Azure 时,构建失败并出现此错误。 我尝试通过放置 ./backend 以及其他内容来调整第 12 行的路径,但没有任何运气。 我们做错了什么?我认为 VS 中的 docker 支持更容易。

azure azure-devops azure-pipelines visual-studio-2022
1个回答
0
投票

错误:无法解决:无法计算缓存密钥:无法计算引用 2686415c-d675-4aa2-a9d0-5b8f2b68eac4::pvmze5n8ahasa8psyougi22ap 的校验和:“/backend/backend.csproj

问题的原因是,当您在Azure DevOps Pipeline中使用Docker任务时,工作目录将默认设置为与dockerfile相同的路径。

从文件结构来看,dockerfile 位于 .csproj 目录的下一个文件夹级别。在这种情况下,它将无法找到 .csproj 文件。

要解决此问题,您需要将

dockerfile
文件移动到与
Backend.csproj
文件相同的级别。

例如:

->dockerfile
->Backend.csproj
  |
   ->Various project files and folders

然后就可以更改dockerfile中的Copy命令了。

COPY ["backend.csproj", "backend/"]

在这种情况下,将在 docker 构建任务中找到

Backend.csproj

在以下 docker 构建步骤中,您可能会在 dotnet 构建行遇到以下错误:

CSC:错误CS5001:程序不包含适合入口点的静态“Main”方法

要解决这个问题,需要将工程文件复制到路径:

/src/backend

例如:

COPY . /src/backend

dockerfile 示例:

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER app
WORKDIR /app
EXPOSE 8080
EXPOSE 8081

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["backend.csproj", "backend/"]
RUN dotnet restore "./backend/backend.csproj"
COPY . /src/backend
WORKDIR "/src/backend"
RUN dotnet build "./backend.csproj" -c $BUILD_CONFIGURATION -o /app/build

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./backend.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "backend.dll"]
© www.soinside.com 2019 - 2024. All rights reserved.