Bash 将数据写入Dockerfile中的文件

Bash 将数据写入Dockerfile中的文件,bash,shell,docker,dockerfile,file-writing,Bash,Shell,Docker,Dockerfile,File Writing,我有一个shell脚本script.sh,它将一些行写入文件: #!/usr/bin/env bash printf "blah blah blah blah\n" | sudo tee file.txt 现在在我的Dockerfile中,我添加这个脚本并运行它,然后尝试添加生成的文件.txt: ADD script.sh . RUN chmod 755 script.sh && ./script.sh ADD file.txt . 当我执行上述操作时,我只是在引用

我有一个shell脚本script.sh,它将一些行写入文件:

#!/usr/bin/env bash
printf "blah 
blah 
blah 
blah\n" | sudo tee file.txt
现在在我的Dockerfile中,我添加这个脚本并运行它,然后尝试添加生成的
文件.txt

ADD script.sh .
RUN chmod 755 script.sh && ./script.sh 
ADD file.txt . 
当我执行上述操作时,我只是在引用
ADD file.txt时收到一个错误。
命令:

lstat file.txt:没有这样的文件或目录

为什么docker找不到我的shell脚本生成的文件?
我在哪里可以找到它?

这是因为Docker在开始时将目录(Dockerfile所在位置)的整个上下文加载到Docker守护进程。从Docker docs

构建由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>
#/usr/bin/env bash
printf“废话
废话
废话
blah\n“| sudo tee/file.txt
docker build--标记您的标记
并修改Dockerfile以添加生成的文本文件

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

当您
运行chmod 755 script.sh&&。/script.sh
时,它实际上在docker容器内执行此脚本(即:在docker层中)

当您
addfile.txt.
尝试从docker容器内的本地文件系统添加文件时(即:在新的docker层中)

您不能这样做,因为您的计算机上不存在文件.txt


事实上,您已经在docker中有了这个文件,请尝试运行docker--rm-ti mydockerimage cat file.txt,您应该会看到它显示的内容

我认为输出的文件实际上可能位于docker图像层本身。我想这可能是因为我删除了
addfile.txt
行,并将其替换为
CMD[“cat”,“file.txt”]
。我能够构建图像并正确运行容器,它显示“布拉布拉布拉布拉布拉…”是的,事后我意识到了这一点。