在Dockerfile中将数据写入文件

我有一个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不能find我的shell脚本生成的文件? 我能在哪里find它?

当你RUN chmod 755 script.sh && ./script.sh它实际上在docker容器执行这个脚本(即:在docker图层中)。

当你ADD file.txt . 您尝试在Docker容器内的本地文件系统上添加一个文件(即:在新的Docker层中)。

你不能这样做,因为您的计算机上不存在file.txt。

事实上,你已经在docker里有这个文件,试试docker run --rm -ti mydockerimage cat file.txt ,你应该看到它的内容显示

这是因为Docker会将目录(Dockerfile所在的位置)的整个上下文加载到Docker守护进程中。 从Docker文档中,

构build由Docker守护程序运行,而不是由CLI运行。 构build过程所做的第一件事是将整个上下文(recursion地)发送到守护进程。 在大多数情况下,最好以空目录作为上下文,并将Dockerfile保存在该目录中。 仅添加构buildDockerfile所需的文件。

由于您的文本文件在开始时不可用,因此您会收到该错误消息。 如果您仍然希望将该文本文件添加到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> 
Interesting Posts