Docker:复制失败:在构建上下文中找不到文件(Dockerfile)

Jac*_*aco 47 ubuntu docker

我想指示 DockerCOPY从我的 Ubuntu 计算机上的本地/etc/文件夹获取我的证书。

我收到错误:

复制失败:在构建上下文中找不到文件或被 .dockerignore 排除:stat etc/.auth_keys/fullchain.pem:文件不存在

我没有排除在.dockerignore

我该怎么做?

Dockerfile:

FROM nginx:1.21.3-alpine

RUN rm /etc/nginx/conf.d/default.conf
RUN mkdir /etc/nginx/ssl
COPY nginx.conf /etc/nginx/conf.d
COPY ./etc/.auth_keys/fullchain.pem /etc/nginx/ssl/
COPY ./etc/.auth_keys/privkey.pem /etc/nginx/ssl/

WORKDIR /usr/src/app
Run Code Online (Sandbox Code Playgroud)

我也尝试过没有dot--> 相同的错误

COPY /etc/.auth_keys/fullchain.pem /etc/nginx/ssl/
COPY /etc/.auth_keys/privkey.pem /etc/nginx/ssl/
Run Code Online (Sandbox Code Playgroud)

通过将文件夹放在.auth_keysDockerfile 旁边 --> 可以,但不理想

COPY /.auth_keys/fullchain.pem /etc/nginx/ssl/
COPY /.auth_keys/privkey.pem /etc/nginx/ssl/
Run Code Online (Sandbox Code Playgroud)

Jus*_*udo 43

docker context 是 Dockerfile 所在的目录。如果你想构建一个镜像,这是你必须面对的限制之一。

本文档中,您可以了解如何切换上下文,但为了简单起见,只需将同一目录视为上下文即可。笔记; 这也不适用于符号链接。

所以你的观察是正确的,你需要将需要复制的文件放在同一目录中。

或者,如果您不需要复制它们但在运行时仍然可以使用它们,您可以选择安装。我可以想象这在您的情况下不起作用,因为您可能在容器启动时需要这些文件。


gol*_*pha 16

在这种情况下,@JustLudo 的答案是正确的。但是,对于那些在构建目录中拥有正确文件但仍然看到此问题的人;删除所有尾随注释。

来自 C 和 javascript 背景的人可能会假设忽略尾随注释(例如COPY my_file /etc/important/ # very important!),但事实并非如此!从我的 docker 版本(20.10.11)开始,错误消息不会指出这一点。

例如上面的错误行会报错:

COPY failed: file not found in build context or excluded by .dockerignore: stat etc/important/: file does not exist

...即没有提及是尾随# important!导致了事情的发生。


nns*_*nse 14

同样重要的是要注意,正如文档中提到的

如果您使用 STDIN 或指定指向纯文本文件的 URL,系统会将内容放入名为 Dockerfile 的文件中,并且任何 -f、--file 选项都会被忽略。在这种情况下,没有上下文

也就是说,如果你build像这样运行:

docker build -t dh/myimage - < Dockerfile_test
Run Code Online (Sandbox Code Playgroud)

任何没有上下文的COPYor都会抛出提到的错误或其他类似的错误:ADD

failed to compute cache key: "xyz" not found: not found
Run Code Online (Sandbox Code Playgroud)

如果您遇到此错误并且正在通过管道传输您的Dockerfile,那么我建议使用-f目标自定义Dockerfile.

docker build -t dh/myimage -f Dockerfile_test .
Run Code Online (Sandbox Code Playgroud)

.将上下文设置为当前目录)


您可以自己做一个测试:

  1. 在空目录中创建一个Dockerfile_test文件,其中包含以下内容
FROM nginx:1.21.3-alpine
COPY test_file /my_test_file
Run Code Online (Sandbox Code Playgroud)
  1. 然后创建一个虚拟文件:
touch test_file
Run Code Online (Sandbox Code Playgroud)
  1. 运行build管道测试Dockerfile,看看它是如何失败的,因为它没有上下文
docker build -t dh/myimage - < Dockerfile_test
[..]
failed to compute cache key: "/test_file" not found: not found
[..]
Run Code Online (Sandbox Code Playgroud)
  1. 现在运行buildwith -f,看看它是如何Dockerfile工作的,因为它有上下文
docker build -t dh/myimage -f Dockerfile_test .
[..]
 => [2/2] COPY test_file /my_test_file
 => exporting to image
[..]
Run Code Online (Sandbox Code Playgroud)