我想指示Docker在我的Ubuntu机器上的本地/etc/
文件夹中COPY
我的证书。
我得到的错误是:
复制失败:在生成上下文中找不到文件或文件被.dockerIgnore:stat等/.auth_key/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
我也尝试了,但没有出现dot
-->相同的错误
COPY /etc/.auth_keys/fullchain.pem /etc/nginx/ssl/
COPY /etc/.auth_keys/privkey.pem /etc/nginx/ssl/
通过将文件夹.auth_keys
放在Dockerfile-->旁边,可以工作,但并不可取
COPY /.auth_keys/fullchain.pem /etc/nginx/ssl/
COPY /.auth_keys/privkey.pem /etc/nginx/ssl/
4条答案
按热度按时间wh6knrhe1#
Docker上下文是Dockerfile所在的目录。如果你想建立一个形象,这是你必须面对的限制之一。
在this documentation中,您可以看到如何切换上下文,但为了简单起见,只需将相同的目录视为上下文。注意:这也不适用于符号链接。
因此,您的观察是正确的,您需要将需要复制的文件放在同一目录中。
或者,如果您不需要复制它们,但在运行时仍然可以使用它们,您可以选择挂载。我可以想象这在您的情况下不起作用,因为您可能需要在容器启动时使用这些文件。
6rqinv9w2#
在这种情况下,@JustLudo的答案是正确的。但是,对于那些在构建目录中有正确的文件并且仍然看到这个问题的人,请删除任何尾随的注解。
来自C和Java的背景,假设后面的注解被忽略是情有可原的(例如
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!
把事情绊倒了。b4qexyjb3#
还需要注意的是,作为mentioned into the docs:
如果使用STDIN或指定指向纯文本文件的URL,系统会将内容放入一个名为Dockerfile的文件中,并且忽略任何-f,--file选项。在此场景中,没有上下文。
也就是说,如果您像这样运行
build
:任何没有上下文的
COPY
或ADD
都会抛出上述错误或其他类似的错误:如果您遇到这个错误,并且您正在通过管道传输
Dockerfile
,那么我建议您使用-f
来瞄准自定义的Dockerfile
。(
.
设置当前目录的上下文)下面是一个你可以自己做的测试:
1.在空目录中,创建一个
Dockerfile_test
文件,内容如下1.然后创建一个虚拟文件:
1.运行
build
管道测试Dockerfile
,查看它如何失败因为它没有上下文:1.现在使用
-f
运行build
,看看相同的Dockerfile
是如何工作的因为它有上下文:ef1yzkbh4#
我只是在构建Windows容器时引用了源文件,例如,
COPY "file with space.txt" c:/some_dir/new_name.txt
多克不喜欢这些引语。