首页 > 解决方案 > .NetCore 微服务 CI 管道 Azure DevOps Build error @ docker image

问题描述

我对 docker 技术非常陌生,在 Docker 映像任务的 Azure DevOps CI 管道上创建 .Net Core 3.1 时遇到构建错误:

步骤 7/17 : COPY ["API2/API2.csproj", "API2/"] COPY failed: CreateFile \?\C:\ProgramData\docker\tmp\docker-builder021493529\API2\API2.csproj: 系统找不到指定的路径。

我的默认泊坞窗文件是

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1809 AS base 
WORKDIR /app 
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1809 AS build
WORKDIR /src
COPY ["API1/API1.csproj", "API1/"]
RUN dotnet restore "API1/API1.csproj"
COPY . .
WORKDIR "/src/API1"
RUN dotnet build "API1.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "API1.csproj" -c Release -o /app/publish
FROM base AS final 
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "API1.dll"] 

请让我知道我在哪里做错了。

以下是 docker 任务:

在此处输入图像描述

以下是 azure DevOps 上的文件夹和文件结构:

文件结构

标签: dockerazure-devopscontinuous-integrationazure-pipelines

解决方案


复制 ["API1/API1.csproj", "API1/"]

根据错误消息,这应该是导致错误消息的行。

步骤1:

请确保您没有将.dockerignore文件配置为排除此文件:API1/API1.csproj,该文件必须存在于您运行构建的目录中。

第2步:

经过以上确认,现在我们可以认为错误是由于服务器无法csproj正确找到文件,请按照您提供的上下文和路径。


根据你原来的定义:API1/API1.csproj,我猜你的存储库中的实际路径API1.csproj应该是src/API1/API1.csproj,对吧?

如果是,这里有 2 种方法您可以尝试:

1)。COPY将定义更改为:

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

更新:

应用此方法时,您可能会成功 COPY,但会失败Program does not contain a static 'Main' method suitable for an entry point *****

这意味着COPY . .没有正确复制文件。

此时,也请更改COPY . .COPY . API1/。这会将文件夹添加到 dest path

2)。另一种方法是您可以API1Build context任务中指定:

以下是我正在使用的,我不需要对我的dockerfile

您可以$(Build.Repository.LocalPath)通过替换硬编码上下文来输入:

在此处输入图像描述

更新:

在 Docker 2.* 中,您还可以将构建上下文保留为**

在此处输入图像描述

您可以参考我之前对此类问题的回答:#1


根据我的观点,我不推荐我上面提到的第一种方法,因为它让你dockerfile与可以在 Visual Studio 中成功运行的方法不同。


推荐阅读