VS 2017复制失败:Docker文件,CreateFile系统找不到指定的文件

8

COPY失败:CreateFile \?\C:\ProgramData\Docker\tmp\docker-builder056926419\WebApplication1.sln:系统找不到指定的文件。

示例文件:

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

FROM microsoft/aspnetcore-build:2.0 AS builder
WORKDIR /src
COPY WebApplication1.sln ./
COPY WebApplication1/WebApplication1.csproj Web/
RUN dotnet restore
COPY . .
WORKDIR /src/Web
RUN dotnet build -c Release -o /app


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

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

在使用命令行构建Docker时,我遇到了这些错误。该项目是从VS 2017创建的。 - user3449299
从microsoft/aspnetcore:2.0作为基础 工作目录/app 暴露80端口从microsoft/aspnetcore-build:2.0作为构建器 工作目录/src 复制WebApplication1.sln ./ 复制WebApplication1/WebApplication1.csproj Web/ 运行dotnet restore 复制 . . 工作目录/src/Web 运行dotnet build -c Release -o /app从builder AS发布 运行dotnet publish -c Release -o /app从production AS基础 工作目录/app 复制--from=publish /app . 入口点["dotnet", "WebApplication1.dll"] - user3449299
5个回答

8
在Visual Studio 2019中,我遇到了一个有趣的问题/情况。当您尝试创建由VS自动生成的dockerfile时,生成的Dockerfile位于主项目中,而不是根(.sln)文件夹中,其中存在.dockerignore
我的项目具有以下文件夹结构:
<DIR>          .
<DIR>          ..
            82 .dockerignore
         6 305 .gitignore
<DIR>          MyProject.API
<DIR>          MyProject.API.Client
<DIR>          MyProject.Model
<DIR>          MyProject.Repository
<DIR>          MyProject.Repository.Settings
         6 567 MyProject.sln
         4 899 README.md
<DIR>          Tests.MyProject.Repository
<DIR>          Tests.Model
<DIR>          Tests.MongoContext.Infrastructure
<DIR>          Tests.MongoQuery
<DIR>          Tests.OdataFilters

主要项目是位于MyProject.API下的 MyProject.API.csproj(Web API)。

从 Visual Studio 自动生成的 Dockerfile 结构如下:

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

#VS generate copy command explicitly for dependencies of main project (model, repository, settings, etc.)
FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["MyProject.API/MyProject.API.csproj", "MyProject.API/"]
COPY ["MyProject.Model/MyProject.Model.csproj", "MyProject.Model/"]
COPY ["MyProject.Repository/MyProject.Repository.csproj", "MyProject.Repository/"]
COPY ["MyProject.Repository.Settings/MyProject.Repository.Settings.csproj", "MyProject.Repository.Settings/"]
RUN dotnet restore "MyProject.API/MyProject.API.csproj"
COPY . .
WORKDIR "/src/MyProject.API"
RUN dotnet build "MyProject.API.csproj" -c Release -o /app

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

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

当我尝试根据 Docker 的指示构建我的镜像 (链接) 时,出现了问题:
Linux 容器类型:
Step 7/20 : COPY ["MyProject.API/MyProject.API.csproj", "MyProject.API/"]
COPY failed: stat /var/lib/docker/tmp/docker-builder799586484/MyProject.API/MyProject.API.csproj: no such file or directory

Windows 容器类型:

Step 7/20 : COPY ["MyProject.API/MyProject.API.csproj", "MyProject.API/"]
COPY failed: CreateFile \\?\C:\ProgramData\Docker\tmp\docker-builder753862033\MyProject.API\MyProject.API.csproj: The system cannot find the path specified.

根据这个答案,我将我的Dockerfile移动到根目录(存在.sln和.dockerignore文件的位置),问题得以解决。

1

1
如果您遇到此问题,特别是在使用Visual Studio时,我有98%的把握认为它是由于.dockerignore文件中缺少异常引起的。 您需要将您的文件/目录添加到.dockerignore的异常列表中。

没错,我删掉了dockerignore文件,然后复制就成功了。 - Rohit Kumar

1
这可能是由于您的DockerFile旁边的.dockerignore文件引起的,它忽略了除/obj/Docker/之外的所有内容。
*
!obj\Docker\publish\*
!obj\Docker\empty\

.dockerignore 更新为:
Dockerfile
[b|B]in
[O|o]bj

0

针对vs2017

docker build -t sampleapplication . -f sampleapplication/dockerfile

正常构建失败,因为无法找到Docker文件的确切路径,所以您可以观察dockerfile.yml中的COPY命令

["sampleapplication/sampleapplication.csproj","sampleapplication/"]

另外,我们还有一个简单的技巧,适用于那些使用vs的人。可以通过更改dockfile中的复制命令来构建docker文件。

["./sampleapplication.csproj","sampleapplication/"]

运行 dotnet restore "./sampleapplication.csproj"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接