将数据写入Dockerfile中的文件

时间:2016-06-22 18:59:13

标签: bash shell docker dockerfile file-writing

我有一个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 个答案:

答案 0 :(得分:5)

当你RUN chmod 755 script.sh && ./script.sh实际执行此脚本内的docker容器(即:在docker图层中)时。

当您ADD file.txt .尝试在docker容器内的本地文件系统中添加文件时(即:在新的泊坞窗层中)。

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

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

答案 1 :(得分: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>