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

新手上路,请多包涵

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

错误代码

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

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

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

Dockerfile 客户端

原文由 Sjardi Djoy Willems 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 921
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 文件转到父目录并使用 -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 指定。任何路径(例如 COPY 中的指令)都相对于指定的位置。 . 表示“当前目录”,在我的示例中是 \WorkerService2

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

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

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

原文由 GregHNZ 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

原文由 Ilia Reshetnikov 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进