繁体   English   中英

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

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

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

错误代码

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

更改复制路径的第二个错误

我究竟做错了什么? 我将 Docker Linux 更改为 Windows,更改了WSL并重新启动了所有内容。

Dockerfile 客户

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

Visual Studio 的做法有点奇怪。

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

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

我的演示项目的设置是

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

所以我希望go

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

相反,go 到父目录,带有.sln文件并使用 docker -f选项指定 Dockerfile 在子文件夹中使用:

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 将使用的文件的位置。 通常这是包含 Dockerfile 的文件夹,但这就是 VS 的不同之处。 在这种情况下,dockerfile 使用-f指定。 任何路径(例如 dockerfile 中的COPY指令)都相对于指定的位置。 . 表示“当前目录”,在我的示例中为\WorkerService2

我通过检查构建过程的 output 进入了这个阶段,详细程度设置为详细。 如果你选择工具/选项/项目和解决方案/构建和运行你可以调整构建 output 详细程度,我做了我的详细。

编辑#2我想我已经弄清楚了为什么 Visual Studio 会这样做。 它允许复制同一解决方案中的项目引用。

如果它被设置为从项目文件夹docker build docker,docker 将无法COPY解决方案中的任何其他项目。但是这种设置方式,当前目录是解决方案文件夹,您可以复制引用的项目(子文件夹)到您的 docker 构建过程中。

我遇到了同样的问题,我在添加 Docker 支持时将 Docker 环境设置为 Windows。 即使在 Visual Studio 中运行也会引发错误。 我将环境更改为 Linux 因为我的 Docker 在 ZEDC9F0A5A5ASLD57797BF6ZWE3 的 Windows 子系统中运行()

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

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

我做了docker build

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

然后我做了docker run

docker run containername/tag

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

就我而言,我尝试过

 > [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 构建在目录名称中区分大小写,所以我在 COPY 指令中编写 /bin/release/net5.0/publish 并失败并出现同样的错误,我刚刚更改为 /bin/Release /net5.0/publish 并且有效

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

在我的情况下,文件夹/文件排除在 .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文件夹。

我遇到过同样的问题。 就我而言,指定了错误的目录。 我的 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

以下命令失败, 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 .

我也遇到过同样的问题。

原因是 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 命令指定的路径)。

在我的情况下,我在“/”和“”中犯了错误。 让我解释一下打开你的 dockerfile(它应该被命名为 dockerfile,而不是 DockerFile 或 Dockerfile)。 你可能有这样的东西 - FROM mcr.microsoft.com/dotnet/runtime:5.0 COPY bin\Release\net5.0\publish。 入口点 ["dotnet", "HelloDocker.dll"]

替换COPY bin\Release\net5.0\publish。 复制到 bin/Release/net5.0/publish。

就我而言, 使用 PATH 配置构建是错误的,例如 Docker build context

  1. 简单的 docker 脚本
    docker build.
    哪里. 是构建上下文的路径
  2. 摇篮+码头工人
    docker { dependsOn build dependsOn dockerFilesCopy name "${project.name}:${project.version}" files "build" // path to build context }
  3. Gradle+GitHub 操作
    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。

在我的情况下,我更改了 docker-compose.yml 配置中 Dockerfile 的上下文和路径:

services:
    server:
        # inheritance structru
        extends:
            file: ../../docker-compose.server.yml
        # I recommend you to play with this paths
        build:
            context: ../../
            dockerfile: ./apps/${APP_NAME}/Dockerfile
        ...

我有一个类似的问题:显然,出于安全原因, docker在构建期间将文件系统根目录到指定的构建目录。 因此, COPYADD不能引用主机文件系统上的任意位置。 此外,语法特性还存在其他问题。 最终起作用的是以下内容:

COPY ./script_file.sh  /
RUN /script_file.sh

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM