构建 Docker 镜像时出现“ADD failed : No such file/Directory”错误。

25

I have below Dockerfile:

FROM python:3

RUN mkdir -p /test/code/
RUN mkdir -p /test/logs/
RUN mkdir -p /test/configs/

ADD test.py /test/code/
ADD test_output.txt /test/code/
ADD test_input.txt /test/configs/
ADD logfile.log /test/logs/


CMD [ "python3", "/test/code/test.py" ]

我的目录结构如下:

/home/<username>/test/
                 |-> code/Dockerfile, test_output.txt, test.py
                 |-> logs/logfile.log
                 |-> configs/test_input.txt

当我使用以下命令构建Docker镜像时: ```docker docker build -t image-name . ```
sudo docker build -t myimage .

它显示以下错误:
Step 7/9 : ADD test_input.txt /test/configs/
ADD failed: stat /var/lib/docker/tmp/docker-builder562406652/test_input.txt: no such file or directory

为什么当我的目录和文件都存在时,会显示这个错误。
3个回答

39
这不起作用是因为test_input.txt不在docker构建上下文中。
当您执行命令sudo docker build -t myimage .时,最后一个“.”表示构建上下文。Docker会将上下文上传到docker守护程序以构建镜像。在您的情况下,上下文不包含test_input.txt,因此未上传,docker找不到该文件。
有两种解决方法:
  1. 在测试目录中运行命令sudo docker build -t myimage -f code/Dockerfile .。在这种情况下,上下文包括所有测试目录。然后修改Dockerfile以适应此更改:
FROM python:3
...    
ADD code/test.py /test/code/
ADD code/test_output.txt /test/code/
ADD config/test_input.txt /test/configs/
ADD logs/logfile.log /test/logs/
  1. 第二个选项是将Dockerfile移动到测试文件夹并按上述方式进行修改。在这种情况下,命令sudo docker build -t myimage .应该可以工作。

对于您的第一个选项,在构建时会出现错误,指出“它需要恰好1个参数”。对于第二个选项,镜像成功构建,但当我运行其容器时,它会显示“python3:无法打开文件'/test/code/test.py':[Errno 20] 不是目录”。 - Anna Carolina
@AnnaCarolina 对于第一个选项,Docker抱怨的构建命令参数.缺失。已经修复了这个问题。至于第二个错误,请尝试通过运行sudo docker run -it myimage bash浏览容器,并转到/test/code,确保test/py不存在。 - yamenk

8

同时确保不在.dockerignore文件中添加在镜像构建过程中所需的文件或文件夹。


1
如果您收到“文件已存在”的错误,则确保您添加的文件不在.dockerignore中,就像@soscier所说的那样。 - Tara Prasad Gurung

0

由于test_input.txt在另一个目录中,要么将此文件放置在与dockerfile相同的位置(类似于test_output.txt),要么在ADD命令中提供完整路径。

ADD ../configs/test_input.txt /test/configs/

即使对于logfile.log,您也会收到错误消息,因此请更改为:
ADD ../logs/logfile.log /test/logs/

你所说的完整路径是 /home/<username>/test/configs/test_input.txt,日志文件也是同样的路径。 - Anna Carolina
是的,或者只需使用../文件夹名称返回一个文件夹。 - sanath meti
是的,我已经给出了完整路径,但它仍然显示错误。 - Anna Carolina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接