在Dockerfile中写入数据到文件

17

我有一个名为 script.sh 的 shell 脚本,它会向文件中写入一些内容:

#!/usr/bin/env bash
printf "blah 
blah 
blah 
blah\n" | sudo tee file.txt

现在,在我的 Dockerfile 中,我添加了这个脚本并运行它,然后尝试添加生成的 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个回答

11
当您运行 chmod 755 script.sh && ./script.sh 命令时,实际上是在 Docker 容器中执行此脚本(也就是在 Docker 层中执行)。
当您运行 ADD file.txt . 命令时,您试图将本地文件系统中的文件添加到 Docker 容器中(即添加到一个新的 Docker 层中)。
这是不可能的,因为计算机上不存在名为 file.txt 的文件。
事实上,您已经在 Docker 中拥有此文件,在命令行中输入 docker run --rm -ti mydockerimage cat file.txt 即可查看其内容。

1
由于Docker在开始时会将Dockerfile所在目录的整个上下文加载到Docker守护程序中,因此出现了这种情况。根据Docker文档,构建是由Docker守护程序而不是CLI运行的。构建过程的第一步是将整个上下文(递归地)发送到守护程序。在大多数情况下,最好以空目录作为上下文,并将Dockerfile保存在该目录中。仅添加构建Dockerfile所需的文件。由于你的文本文件在开始时不可用,因此出现了错误消息。如果你仍然希望将该文本文件添加到Docker镜像中,可以从同一脚本文件中调用“docker build”命令。修改script.sh文件。
#!/usr/bin/env bash
printf "blah 
blah 
blah 
blah\n" | sudo tee <docker-file-directory>/file.txt
docker build --tag yourtag <docker-file-directory>

修改Dockerfile文件,只需添加生成的文本文件即可。

ADD file.txt
.. <rest of the Dockerfile instructions>

1
我认为生成的文件实际上可能在Docker镜像层本身中。我认为这种情况可能是因为我删除了“ADD file.txt”行并用“CMD [“cat”,“file.txt”]”替换它。 我能够正确构建图像和运行容器,并显示“blah blah bla..”。 - pcsram

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