在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>