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
中
- 从 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
- 简单 docker 脚本
docker build .
其中 .
是构建上下文的路径
- Gradle+Docker
docker {
dependsOn build
dependsOn dockerFilesCopy
name "${project.name}:${project.version}"
files "build" // path to build context
}
- 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!!!>"
我用 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
中- 从 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
- 简单 docker 脚本
其中docker build .
.
是构建上下文的路径 - Gradle+Docker
docker { dependsOn build dependsOn dockerFilesCopy name "${project.name}:${project.version}" files "build" // path to build context }
- 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!!!>"