首页 > 解决方案 > ASP.NET 4.7.2 - Docker - 复制失败:CreateFile + 系统找不到指定的文件

问题描述

我使用 Visual Studio 2019 创建了一个全新的 ASP.NET 4.7.2 MVC Web 应用程序。在 Visual Studio 2019 中初始化解决方案时,我选中了该Docker support复选框。这添加了一个名为Dockerfile我的项目的文件,如下所示:

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2019
ARG source
WORKDIR /inetput/wwwroot
COPY ${source:-obj/Docker/publish} .

我尝试使用buildAzure DevOps 中 Docker 任务中的命令构建 Docker 映像。当我这样做时,我得到以下信息:

Step 1/13 : FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2019
  ---> [id1]
Step 2/13 : ARG source
  ---> Running in [id2]
Removing immediate container [id2]
  ---> [id3]
Step 3/13 : WORKDIR / inetpub/wwwroot
  ---> Running in [id4]
Removing immediate container [id4]
COPY failed: CreateFile \\?\C:\ProgramData\docker\tmp\docker-build-[id5]\obj\Docker\publish: The system cannot find the path specified.
  ---> [id6]
STEP 4/13 : COPY ${source:-obj/Docker/publish} .

怎么了?为什么复制失败?显然这是因为它“找不到文件”。但是,我不确定它应该在哪里。我没有更改 Dockerfile。我只是尝试从 Azure DevOps 中的“Hello World”ASP.NET 4.7.2 Web 应用程序构建 Docker 映像。我正在尝试学习如何将 Docker 与 Azure DevOps 一起使用。

谢谢

标签: dockerazure-devops

解决方案


复制 ${source:-obj/Docker/publish} 。

首先,我们需要知道这个脚本行是什么意思。它表达的是:

嗨 Docker,这里有一个请求。请将COPY您从路径中找到的文件$source放入图像的当前目录.中。如果里面什么都没有$source或者不存在,就走默认路径obj/Docker/publish并使用它。

总之,这个脚本试图从 obj/Docker/publish 复制您编译的 .NET 应用程序位

脚本格式可以参考本指南


用一句话来表示上面的编译过程,就是试图从 obj/Docker/publish 复制编译好的 ASP.NET 应用程序

因此,在 Azure Devops 中,您需要在构建映像之前添加一个构建任务来构建解决方案。然后使用 Copy file 任务将构建文件复制到 docker 映像中。否则,该${source:-obj/Docker/publish}文件夹将不会显示。

由于你的项目是一个 ASP.NET 项目,你可以按照这个文档和这个博客来实现你的项目构建。


另外,你可以参考这个线程

两个答案中提供的解决方案都是正确的,只是方向不一样。第一个解决方案是修改dockerfile以使其适用于 Azure devops,而无需任何解决方案构建。而在第二个答案中,它是使用我上面提到的 Azure Devops 中的任务,来实现项目可以docker build使用默认的dockerfile.


推荐阅读