Docker:COPY失败:CreateFile,在奇怪的位置查找文件

Jer*_*acs 7 docker .net-core dockerfile

试着按照这里的教程,但遇到问题.

我从我的项目目录运行以下命令:

docker build -t my.solution .
Run Code Online (Sandbox Code Playgroud)

......我得到以下内容:

Sending build context to Docker daemon  111.6kB
Step 1/17 : FROM microsoft/aspnetcore:2.0-nanoserver-1709 AS base
 ---> ccfb41c8f5b5
Step 2/17 : WORKDIR /app
 ---> Using cache
 ---> e29a68e16001
Step 3/17 : EXPOSE 80
 ---> Using cache
 ---> 976388139964
Step 4/17 : FROM microsoft/aspnetcore-build:2.0-nanoserver-1709 AS build
 ---> d7ab4e860769
Step 5/17 : WORKDIR /src
 ---> Using cache
 ---> 4ab01220723e
Step 6/17 : COPY my.solution.sln ./
COPY failed: CreateFile \\?\C:\ProgramData\Docker\tmp\docker-builder564035917\my.solution.sln: The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它试图在它正在寻找它的位置找到该文件.谁能帮我?我需要进行配置设置吗?我的Docker文件如下所示:

FROM microsoft/aspnetcore:2.0-nanoserver-1709 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0-nanoserver-1709 AS build
WORKDIR /src
COPY my.solution.sln ./
COPY my.solution/my.solution.csproj my.solution/
RUN dotnet restore -nowarn:msb3202,nu1503
COPY . .
WORKDIR /src/my.solution
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "my.solution.dll"]
Run Code Online (Sandbox Code Playgroud)

UPDATE

根据@ AlexGera的回答,我尝试将docker文件更改为:

FROM microsoft/aspnetcore:2.0-nanoserver-1709 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0-nanoserver-1709 AS build
WORKDIR /src
VOLUME C:/tmp
COPY my.solution.sln c:/tmp/
COPY my.solution/my.solution.csproj my.solution/
RUN dotnet restore -nowarn:msb3202,nu1503
COPY . .
WORKDIR /src/my.solution
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "my.solution.dll"]
Run Code Online (Sandbox Code Playgroud)

...但错误消息没有显着变化:

docker build -t my.solution .
Sending build context to Docker daemon  111.6kB
Step 1/18 : FROM microsoft/aspnetcore:2.0-nanoserver-1709 AS base
 ---> ccfb41c8f5b5
Step 2/18 : WORKDIR /app
 ---> Using cache
 ---> e29a68e16001
Step 3/18 : EXPOSE 80
 ---> Using cache
 ---> 976388139964
Step 4/18 : FROM microsoft/aspnetcore-build:2.0-nanoserver-1709 AS build
 ---> d7ab4e860769
Step 5/18 : WORKDIR /src
Removing intermediate container 31e30e2346aa
 ---> 61c7df20f3c4
Step 6/18 : VOLUME C:/tmp
 ---> Running in fada6c728151
Removing intermediate container fada6c728151
 ---> 7a650440cc1f
Step 7/18 : COPY my.solution.sln c:/tmp/
COPY failed: CreateFile \\?\C:\ProgramData\Docker\tmp\docker-builder832533802\my.solution.sln: The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)

小智 22

在我看来,新解决方案附带的标准Dockerfile有问题:/

我将Dockerfile从PowerShell移到了解决方案文件夹:

mv Dockerfile ../Dockerfile
Run Code Online (Sandbox Code Playgroud)

从那里运行docker build命令对我来说是个窍门......

  • 是的,它是Visual Studio创建项目的愚蠢方式,并将dokcerfile放在项目中...而不是解决它的根.有同样的问题..配置文件说进入项目...但正如所解释的上下文已经存在..混淆为一个新手但你解决方案为我修复它感谢+1 (5认同)
  • VS应该在项目文件夹中创建dockerfile是正确的。如果您有一个多项目解决方案(通常是这种情况),则最终在solution文件夹中会有很多dockerfile,这没有任何意义。问题是生成的dockerfile。 (3认同)

BMi*_*tch 5

COPY 命令将从构建上下文或先前的构建阶段(如果您指定阶段)复制文件。使用您的构建命令:

docker build -t my.solution .
Run Code Online (Sandbox Code Playgroud)

上下文.首先发送到 docker 引擎,该引擎将其放置在一个临时位置,仅供构建使用。

因此,使用您的复制命令:

Step 6/17 : COPY my.solution.sln ./
Run Code Online (Sandbox Code Playgroud)

该文件my.solution.sln需要存在于运行构建命令的文件夹中。

对于目的地,文件将被复制到容器内的工作目录中,或者/src在您的示例中。


小智 5

这可能是由 DockerFile 旁边的 .dockerignore 文件引起的,忽略了除 /obj/* 之外的所有内容。一旦你将它复制到另一个文件夹,你就没有复制 .dockerignore 文件,所以没有排除任何东西并且它起作用了。