正在将数据写入Dockerfile中的文件

lvmkulzt  于 2023-02-21  发布在  Docker
关注(0)|答案(2)|浏览(135)

我有一个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脚本生成的文件?我在哪里可以找到它?

u3r8eeie

u3r8eeie1#

当您RUN chmod 755 script.sh && ./script.sh时,它实际上在Docker容器执行此脚本(即:在对接层中)。
当您ADD file.txt .时,您正尝试从Docker容器内的本地文件系统添加文件(即:在新的对接层中)。
您无法执行此操作,因为您的计算机上不存在file.txt
实际上,您已经在docker中有了这个文件,尝试docker run --rm -ti mydockerimage cat file.txt,您应该看到它的内容显示

ngynwnxp

ngynwnxp2#

这是因为Docker在一开始就将目录的整个上下文(您的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>

相关问题