【问题标题】:.NetCore microservice CI pipeline Azure DevOps Build error @ docker image.NetCore 微服务 CI 管道 Azure DevOps Build error @ docker image
【发布时间】:2019-12-30 12:24:00
【问题描述】:

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

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

我的默认docker文件是

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 上的文件夹和文件结构:

【问题讨论】:

  • 你能分享你在 Azure DevOps 中的 Docker 构建任务吗?
  • @ShaykiAbramczyk 请在问题部分找到粘贴的图像
  • 为什么要用任务版0
  • 没有具体原因我也可以使用 2.*,但现在我使用的是 2.* 版本,但仍然面临同样的问题
  • 在第 2 版中,您在 Context 字段中有哪个值?。

标签: docker azure-devops continuous-integration azure-pipelines


【解决方案1】:

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

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

第一步:

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

第二步:

以上确认后,现在我们可以根据你提供的上下文和路径,认为服务器无法正确找到csproj文件引起的错误。


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

如果是,这里有两种方法你可以试试:

1).COPY 定义更改为:

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

更新:

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

这里表示COPY . .没有正确复制文件。

此时,请将COPY . . 更改为COPY . API1/。这将将文件夹添加到目标路径

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

以下是我正在使用的,我不需要对我的dockerfile 进行任何更改:

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

更新:

在 Docker 2.* 中,您还可以将 Build context 留给 **:

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


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

【讨论】:

  • 感谢 @Merlin 发布对我的查询的详细回复:好吧,我迈出了第一步,我更改了 COPY ["API2.csproj", "API2/"] ,现在构建进入下一个级别并现在我面临另一个错误程序不包含适合入口点的静态“主要”方法 [C:\src\API2\API2.csproj] 0 警告 1 错误“
  • @SaadAwan,好的,这就是我不希望你面对的。请将第 9 行更改为 COPY . API1/ 以将文件夹添加到目标路径。正如我在回答中所建议的那样,我强烈建议您使用不需要对 dockerfile 进行更改的第二种方法。另外,这里我和shayki有同样的困惑,为什么不用docker 2.*任务呢?有什么问题吗?
  • 现在我正在使用 docker tasks 2.* 并添加与 2019 相比创建的全新 docker 文件,并添加构建上下文 $(Build.Repository.LocalPath),但结果仍然相同 API2\API2。 csproj: 系统找不到指定的路径
  • @SaadAwan。对于 CI,默认情况下在项目级别的 dockerfile 所在的目录中运行 docker,但 VS 在 Repos/Solution 级别运行它。你的文件结构如何?这就是为什么您可以在此处输入 $(Build.Repository.LocalPath)。不知道为什么这不适合你(在我这边它工作正常),请将上下文设置为 ** 并重新构建。我更新了我的答案以使其更清楚。你可以检查一下。
  • @SaadAwan, filebin.net/ofx8y31wmpn6tv5n/dockerfile.txt?t=w8g9rpqh 这是我根据你的 dockerfile 修改的 dockerfile。 注意WORKDIR /src/TestWebAppCOPY . .的顺序,这样可以避免Program does not contain a static 'Main' method的错误。而对于 docker 2.* 任务,您不需要更改任何默认值,就像这样:imgur.com/a/k7jvnfo 这是我在回答中提到的 解决方案 1。和我的回答不同,这里我改变了COPYWORKDIR的顺序,那么你就不需要改变COPY . .
猜你喜欢
  • 2021-11-30
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 2022-11-24
相关资源
最近更新 更多