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

Posted

技术标签:

【中文标题】Docker - 无法计算缓存键:未找到 - 在 Visual Studio 中运行良好【英文标题】:Docker - failed to compute cache key: not found - runs fine in Visual Studio 【发布时间】:2021-05-14 16:24:17 【问题描述】:

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

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

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

Dockerfile client

【问题讨论】:

这对我有用 ***.com/a/63257667/15203500 你必须将你的 docker 文件上移一个目录 请不要发图片,使用“代码”功能格式化代码。 【参考方案1】:

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

【讨论】:

谢谢你,伙计。最好的解决方案是最简单的。 对我来说这不是答案(请参阅已接受的答案),谢谢!【参考方案2】:

Visual Studio 的做法有点奇怪。

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

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

我的演示项目的设置是

\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 选项指定要在子文件夹中使用的 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

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

【讨论】:

嘎。正是最后一个点吸引了我。我尝试了完整文件或没有文件的路径的各种组合,但我得到了file not found 问题或可怕的docker build requires exactly 1 argument 消息。不会撒谎,学习 docker 中最微小的新东西就像拔牙一样,FFS。一旦你弄清楚了晦涩难懂的语法和方法,它就会很好用,但在那之前它是一个接一个的总台。 是的,最后的点是什么?您正在指定两个 docker 文件。 @tblev '.'最后告诉 docker 从哪个目录运行,在这种情况下,是解决方案的根目录而不是项目。不过要小心,COPY 命令区分大小写,如果您的项目目录名称与命令不一致(驼峰式大小写等)会混淆 docker【参考方案3】:

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

就我而言,我尝试过

 > [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 构建上下文的子文件夹。

【讨论】:

【参考方案4】:

我有同样的问题,我在添加 Docker 支持时将 Docker 环境设置为 Windows。即使在 Visual Studio 中运行也会引发错误。我将环境更改为 Linux,因为我的 Docker 在 Windows Subsystem for Linux (WSL) 中运行。

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

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

我做了docker build这样的:

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

然后我做了docker run:

docker run containername/tag

【讨论】:

在 .sln 文件夹中使用 -f 选项在此答案前 10 天已经是一个答案。 Re "Linux Subsystem for Windows":你的意思是 Windows Subsystem for Linux (WSL)?【参考方案5】:

在我的情况下,我发现 docker build 在目录名称中区分大小写,所以我在 COPY 指令中编写 /bin/release/net5.0/publish 并失败并出现相同的错误,我刚刚更改为 / bin/Release/net5.0/publish 成功了

【讨论】:

这就是我的答案。 Windows 在路径上不区分大小写有时使使用 docker 变得有趣。【参考方案6】:

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

【讨论】:

【参考方案7】:

我也遇到过同样的问题。

原因是 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 文件匹配。

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

以上是关于Docker - 无法计算缓存键:未找到 - 在 Visual Studio 中运行良好的主要内容,如果未能解决你的问题,请参考以下文章

由于令牌在 24 小时后无法在缓存中找到,Spark Launcher 作业未启动

在docker上使用laravel时无法连接到mysql数据库(未找到,pdo,连接被拒绝)

NestJS + Angular 项目抛出未找到模块:错误:无法解析“缓存管理器”

您如何找到单级缓存的未命中惩罚?

HSQLDB 无法删除未找到的外键约束对象

无法加载缓存键:拉取访问被拒绝 powershell