Docker - 无法计算缓存键:未找到 - 在 Visual Studio 中运行良好

Docker - failed to compute cache key: not found - runs fine in Visual Studio

我用 Visual Studio 生成了一个 Docker 文件。它在 Visual Studio 中运行得很好,现在我正在尝试从 Windows 本身构建它(docker build .,并且我尝试了很多组合)。但是我收到以下错误:

当我将副本更改为 ./client.csproj 时,它会继续,然后我得到:

我做错了什么?我把DockerLinux改成了Windows,改了WSL,然后重启了一切

Dockerfile client

请求不存在的目录会引发此错误。

就我而言,我试过了

 > [stage-1  7/14] COPY /.ssh/id_rsa.pub /.ssh/:
------
failed to compute cache key: "/.ssh/id_rsa.pub" not found: not found

我忘记将 /.ssh 文件夹添加到项目目录中。在您的情况下,您应该检查 /client 是否真的是 Dockerfile 构建上下文的子文件夹。

在我的例子中,我发现 docker build 在目录名称中区分大小写,所以我在 COPY 指令中写 /bin/release/net5.0/publish 并因同样的错误而失败,我'我们刚刚更改为 /bin/Release/net5.0/publish 并且有效

检查您的 .dockerignore 文件。可能它会忽略复制命令所需的文件,并且您无法计算缓存密钥错误。

Visual Studio 的做法有点奇怪。

它不是在包含 Docker 文件的文件夹中启动 docker build,而是在父文件夹中启动并使用 -f 选项指定 Docker 文件。

我正在使用演示项目(试图为另一个问题创建一个最小的解决方案)并且遇到了同样的情况。

我的演示项目的设置是

\WorkerService2  ("solution" folder)
   +- WorkerService2.sln
   +- WorkserService2  ("project" folder)
       +- DockerFile
       +- WorkerService2.csproj
       +- ... other program files

所以我希望

cd \Workerservice2\WorkerService2
docker build .

但是我收到了你的错误信息。

 => ERROR [build 3/7] COPY [WorkerService2/WorkerService2.csproj, WorkerService2/]                                                                                                                        0.0s
------
 > [build 3/7] COPY [WorkerService2/WorkerService2.csproj, WorkerService2/]:
------
failed to compute cache key: "/WorkerService2/WorkerService2.csproj" not found: not found

而是转到父目录,使用 .sln 文件并使用 docker -f 选项指定要在子文件夹中使用的 Docker 文件:

cd \Workerservice2
docker build -f WorkerService2\Dockerfile --force-rm -t worker2/try7 .

docker run -it worker2/try7    

编辑(感谢 Mike Loux、tblev 和 Goku):

注意 docker build 命令的最后一个点。

对于 docker 命令的最后一部分是 Docker 将使用的文件的位置。 通常这是包含Docker文件的文件夹,但这就是 VS 处理方式的不同之处。在这种情况下,docker 文件是用 -f 指定的。任何路径(例如 docker 文件中的 COPY 指令)都是相对于指定位置的。 . 表示“当前目录”,在我的示例中是 \WorkerService2.

我通过检查构建过程的输出进入这个阶段,详细程度设置为详细。 如果你选择 Tools / Options / Projects and Solutions / Build 和 运行 你可以调整构建输出的详细程度,我做了详细的。

我有同样的问题,我在添加 Docker 支持时将 Docker 环境设置为 Windows。甚至 运行ning 在 Visual Studio 中也会抛出错误。我将环境更改为 Linux,因为我的 Docker 在 Linux (WSL) 的 Windows 子系统中 运行ning。

然后我回到终端运行命令。

我可以通过移动到解决方案文件夹(根文件夹)来解决这个问题。

我是这样docker build的:

docker build -t containername/tag -f ProjectFolder/Dockerfile .

然后我做了 docker run:

docker run containername/tag

我遇到了同样的问题。在我的例子中,指定了一个错误的目录。 我的 Dockerfile 是:

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS publish
WORKDIR /app
COPY . .
RUN dotnet publish -c Release -o publish/web src/MyApp/MyApp.csproj

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=publish publish/web .
EXPOSE 80
CMD ASPNETCORE_URLS=http://*:$PORT dotnet MyApp.dll

然后我意识到在第二个构建阶段我试图从目录 publish/web:

复制项目文件
COPY --from=publish publish/web .

但是由于我在第一阶段指定了 workdir /app,我的文件位于图像文件系统的该目录中,因此将路径从 publish/web 更改为 app/publish/web 解决了我的问题。

所以我最终的工作 Dockerfile 是:

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS publish
WORKDIR /app
COPY . .
RUN dotnet publish -c Release -o publish/web src/MyApp/MyApp.csproj

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=publish app/publish/web .
EXPOSE 80
CMD ASPNETCORE_URLS=http://*:$PORT dotnet MyApp.dll

我遇到过同样的问题。

原因是 Docker 文件中的 DLL 文件名区分大小写。

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY MyFirstMicroService.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c release -o /app

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "**MyFirstMicroService.dll**"]

.dll 名称应与您的 .csproj 文件匹配。

在我的例子中,文件名中有一个偷偷摸摸的尾随空格。

------
 > [3/3] COPY init.sh ./:
------
failed to compute cache key: "/init.sh" not found: not found

所以文件实际上被称为“init.sh”而不是“init.sh”。

如果您没有为 COPY 命令输入提供正确的路径,也会发生这种情况。我得到的最重要的线索是 WORKDIR 命令为容器打开一个文件夹,而不是在 windows 资源管理器中(因此它不会影响您需要为 COPY 命令指定的路径)。

以下命令失败 failed to compute cache key: not found:

docker build -t tag-name:v1.5.1 - <Dockerfile

将命令更改为以下内容后,它得到修复:

docker build -t tag-name:v1.5.1 -f Dockerfile .

就我而言, 我在“/”和“”中做错了。让我解释 打开您的 dockerfile(它应该仅命名为 dockerfile,而不是 DockerFile 或 Dockerfile)。 你可能有这样的事情- 来自 mcr.microsoft.com/dotnet/runtime:5.0 复制 bin\Release\net5.0\publish . 入口点 ["dotnet", "HelloDocker.dll"]

COPY bin\Release\net5.0\publish.替换为COPYbin/Release/net5.0/publish.

错误:无法计算缓存键:未找到“src”:未找到

在我的例子中,folder/file 被排除在 .dockerignore

  1. 从 dockerignore 解析文件后能够创建图像。

就我而言,我有这样的事情:

  FROM mcr.microsoft.com/dotnet/aspnet:5.0
  COPY bin/Release/net5.0/publish/ app/
  WORKDIR /app
  ENTRYPOINT ["dotnet", "MyApi.dll"]

我终于意识到我的 .dockerignore 文件中有 bin 文件夹。

在我的例子中,这是一个错误的 Build with PATH 配置,例如Dockerbuild context

  1. 简单 docker 脚本
    docker build . 
    
    其中 . 是构建上下文的路径
  2. Gradle+Docker
    docker {
        dependsOn build
        dependsOn dockerFilesCopy
        name "${project.name}:${project.version}"
        files "build" // path to build context
    }
    
  3. Gradle+GitHub action
    name: Docker build and push
    
    on:
      push:
        branches: [ main ]
    
    # ...
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        # ...
    
        steps:
          - name: Checkout
            uses: actions/checkout@v2
    
         # ...
    
          - name: Build and export to Docker
            uses: docker/build-push-action@v2
            with:
              # ...
              file: src/main/docker/Dockerfile      
              context: ./build                      # path to build context
    

在我的例子中,对于 Angular 项目,我的项目位于名为 ex: My-Folder-Project 的文件夹中,我正在放置 Dockerfile COPY --from=publish app/dist/My-Folder-Project 。 但当然正确的做法是将“名称”放在 package.json 中,例如 COPY --from=publish app/dist/name-in-package.json .

如果您在 VS 生成的文件上遇到此错误,并且在检查 .dockerignore 文件后您仍然收到此错误,请检查您的命令,它应该是这样的

docker build -f "<path-to-your-dockerfile>" -t some-name "<!!!path-to-your-solution-folder!!!>"