在Visual Studio中使用相同的docker文件,用于构建docker映像的Azure管道失败

时间:2019-05-30 23:18:13

标签: docker azure-devops dockerfile azure-pipelines

我正在尝试创建一个部署管道,以将映像部署到Kubernetes集群。此过程的第一步是基于docker文件创建映像。当我添加docker支持并右键单击docker映像并选择创建它时,我正在使用的docker文件是从Visual Studio生成的,并成功创建了该映像。当我配置Azure管道时,创建docker映像会在尝试构建实际解决方案时立即失败。上一步获取了所有源文件,但随后使用

创建docker镜像失败
[error]COPY failed: stat/var/lib/docker/tmp/docker-builder158012929/DockerTest/DockerTest.csproj:
 no such file or directory

[error]/usr/bin/docker failed with return code: 1

以下是从Visual Studio生成的docker文件,azure管道阶段会引用该文件来创建docker映像。

 FROM mcr.microsoft.com/dotnet/core/runtime:2.2-stretch-slim AS base

 WORKDIR /app   
 FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS
 build 

 WORKDIR /src      
 COPY ["DockerTest/DockerTest.csproj", "DockerTest/"]      
 RUN dotnet restore "DockerTest/DockerTest.csproj"      
 COPY . .      
 WORKDIR "/src/DockerTest"      
 RUN dotnet build "DockerTest.csproj" -c Release -o /app  

 FROM build AS publish      
 RUN dotnet publish "DockerTest.csproj" -c Release -o /app

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

enter image description here

  

## [部分]开始:构建容器映像
  ================================================== =============================任务:Docker描述:构建,标记,推送或运行Docker映像,或者   运行Docker命令任务可以与Docker或Azure容器一起使用   注册表。版本:0.150.6作者:Microsoft Corporation帮助:   [更多信息] https://go.microsoft.com/fwlink/?linkid=848006
  ================================================== =========================== [命令] / usr / bin / docker build -f
  / home / vsts / work / 1 / s / DockerTest / Dockerfile -t   ihacontainers.azurecr.io/dockertest:6 / home / vsts / work / 1 / s / DockerTest   将构建上下文发送到Docker守护程序6.144kB步骤1/15:FROM   mcr.microsoft.com/dotnet/core/runtime:2.2-stretch-slim AS基础   2.2-stretch-slim:从dotnet / core / runtime提取743f2d6c1f65:提取fs层074da88b8de0:提取fs层ac831735b47a:提取   fs层3adcc844418d:拉紧fs层3adcc844418d:等待   ac831735b47a:下载完整的743f2d6c1f65:验证校验和   743f2d6c1f65:下载完成074da88b8de0:验证校验和   074da88b8de0:下载完整的3adcc844418d:验证校验和   zadcc844418d:下载完成743f2d6c1f65:拉取完成   074da88b8de0:拉动完成ac831735b47a:拉动完成3adcc844418d:   拉完整的摘要:   sha256:066c31b113b0a20e6155d3bd8a314563c688d2ec31c11d7e551af5bc2595f30c   状态:已下载更新的图片   mcr.microsoft.com/dotnet/core/runtime:2.2-stretch-slim --->   c0f9ab44ecc1步骤2/15:WORKDIR / app --->在6d1a5f5600dd中运行   卸下中间容器6d1a5f5600dd ---> 527fcebeaf1f步骤   3/15:从mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS构建   2.2拉伸:从dotnet / core / sdk提取c5e155d5a1d1:提取fs层221d80d00ae9:提取fs层4250b3117dca:提取fs层   3b7ca19181b2:拉fs层3466298fc231:拉fs层   310737d73ed1:拉fs层dc981de74fae:拉fs层   3b7ca19181b2:等待中3466298fc231:等待中310737d73ed1:等待中   dc981de74fae:等待4250b3117dca:验证校验和4250b3117dca:   下载完整的221d80d00ae9:验证校验和221d80d00ae9:   下载完整的3466298fc231:验证校验和3466298fc231:   下载完整的c5e155d5a1d1:验证校验和c5e155d5a1d1:   下载完整的3b7ca19181b2:验证校验和3b7ca19181b2:   下载完整的c5e155d5a1d1:提取完整221d80d00ae9:提取   完整的310737d73ed1:验证校验和310737d73ed1:下载   完整的4250b3117dca:拉完整的dc981de74fae:校验和   dc981de74fae:下载完成3b7ca19181b2:拉取完成   3466298fc231:拉出完整的310737d73ed1:拉出完整的dc981de74fae:   拉完整的摘要:   sha256:222cc0bb0bc93875ee0f6be626b2838beea838f65e53653e07c33eb9d00b0163   状态:已下载更新的图片   mcr.microsoft.com/dotnet/core/sdk:2.2-stretch ---> e4747ec2aaff步骤   4/15:WORKDIR / src->在a7ebcac87f68中运行删除   中间容器a7ebcac87f68 ---> d7541674a9da步骤5/15:   COPY [“ DockerTest / DockerTest.csproj”,“ DockerTest /”] COPY失败:统计   /var/lib/docker/tmp/docker-builder158012929/DockerTest/DockerTest.csproj:否   这样的文件或目录

     

## [错误]复制失败:stat / var / lib / docker / tmp / docker-builder158012929 / DockerTest / DockerTest.csproj:否   此类文件或目录

     

## [错误] / usr / bin / docker失败,返回代码:1 ## [section]完成:构建容器映像

6 个答案:

答案 0 :(得分:2)

我通过使用与Visual Studio中相同的dockerfile将buildContext设置为'$ {Build.Repository.LocalPath)'来解决此问题,而无需调整路径:

在YAML-Konfiguration中,我添加了以下行:

buildContext: '$(Build.Repository.LocalPath)'

答案 1 :(得分:0)

  

[错误]复制失败:stat / var / lib / docker / tmp / docker-builder158012929 / DockerTest / DockerTest.csproj:没有此类文件或目录

根据此错误消息,该错误发生在您的dockerfile行中:COPY ["DockerTest/DockerTest.csproj", "DockerTest/"]

首先,请确认您没有使用.dockerignore文件来排除此文件:DockerTest/DockerTest.csproj,该文件必须存在于运行生成文件的目录中。

如果.dockerignore文件没有忽略它,那么您需要考虑dockerfile的位置级别。

DockerTest.csproj文件不应放在较低的源文件路径级别。您需要更改上下文的来源,并将其移到更高的级别。因此,将您的dockerfile手动修改为:

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

答案 2 :(得分:0)

当您通过Visual Studio(至少v16.3.9)生成Docker支持并且您在Azure Pipeline中将此生成的项目与预定义的Docker Pipeline模板一起使用时,就会出现此问题。称为经典编辑器的方式,或称为现代编辑器的新型的四步易于点击的方式。

生成的文件中的更改

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

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

解决了Azure管道的问题,但它会破坏您在Visual Studio中的本地版本。

添加

buildContext: '$(Build.Repository.LocalPath)'
对现代编辑器生成的YAML文件

将会中断构建任务。现代编辑器中使用的模板依赖于默认的构建上下文,并且解析器无法识别 buildContext命令。

YAML file from the new editor

解决此问题的唯一可能方法是覆盖默认的构建上下文。此替代将在Visual Studio或Azure Pipeline中保留构建功能。

可以在经典编辑器中的构建映像任务中覆盖构建上下文。

Fixing the build problem in the build image task.

答案 3 :(得分:0)

对我来说,它可以使用以下Yaml设置

步骤:

  • 任务:Docker @ 2

    displayName:构建docker

    输入:

    命令:“ buildAndPush”

    Dockerfile:“ ** / Dockerfile”

    buildContext:'$(Build.Repository.LocalPath)'

dockerfile可以保持在Visual Studio生成的状态。

答案 4 :(得分:0)

就我而言,我具有以下文件夹结构:

     id   |  username |   
------------------------
     1    |   zak     |
     2    |   mike    |
     3    |   john    |

我的docker文件位于项目文件夹中。
修改为仅在第一个副本中使用CSPROJ文件,并收到缺少的MAIN方法错误,并且没有合适的静态主入口点后,我将其替换为将“ copy ..”替换为“ COPY。[project_name] /” < / p>

     id   | experience|   user_class   
---------------------------------
     1    |     22    |     Ninja
     2    |     01    |     Ninja
     3    |     34    |     Pirate

答案 5 :(得分:0)

尝试将 Dockerfile 移动到根目录,以及 .sln 文件。

其他答案都不适合我,它永远找不到 csproj 文件的项目路径。

我的项目只包含一个需要容器化的项目,还有一些支持dll的项目,所以我把Visual Studio创建的原始Dockerfile和.sln文件一起移到了根目录,我们的pipeline构建了镜像并部署了它到我们的 ACR 没问题。

我认为其他解决方案,如果它们对您有用,会更好,但如果不是,并且它适用于您的情况,请试一试。