我有一个shell脚本script.sh,它向一个文件写入一些行:
#!/usr/bin/env bash
printf "blah
blah
blah
blah\n" | sudo tee file.txt
现在,在我的Dockerfile中,我添加并运行这个脚本,然后尝试添加生成的file.txt
:
ADD script.sh .
RUN chmod 755 script.sh && ./script.sh
ADD file.txt .
当我执行上述操作时,我只收到一个引用ADD file.txt .
命令的错误:lstat file.txt: no such file or directory
为什么docker找不到我的shell脚本生成的文件?我在哪里可以找到它?
2条答案
按热度按时间u3r8eeie1#
当您
RUN chmod 755 script.sh && ./script.sh
时,它实际上在Docker容器内执行此脚本(即:在对接层中)。当您
ADD file.txt .
时,您正尝试从Docker容器内的本地文件系统添加文件(即:在新的对接层中)。您无法执行此操作,因为您的计算机上不存在
file.txt
。实际上,您已经在docker中有了这个文件,尝试
docker run --rm -ti mydockerimage cat file.txt
,您应该看到它的内容显示ngynwnxp2#
这是因为Docker在一开始就将目录的整个上下文(您的Docker文件所在的位置)加载到Docker守护进程。
构建由Docker守护程序运行,而不是由CLI运行。构建过程的第一件事是将整个上下文(递归)发送到守护程序。在大多数情况下,最好从一个空目录作为上下文开始,并将您的Dockerfile保存在该目录中。仅添加构建Dockerfile所需的文件。
由于您的文本文件在开始时不可用,您会收到该错误消息。如果您仍然希望将该文本文件添加到Docker映像,您可以从同一脚本文件调用“docker build”命令script.sh。
并修改您的Dockerfile,以便添加生成的文本文件。