Docker在容器运行时从本地系统读取文件

Docker在容器运行时从本地系统读取文件,docker,Docker,MyDockerfile运行一个python脚本,需要从本地机器读取文本文件 Dockerfile FROM fedeg/python-vim:2 ADD . /code WORKDIR /code RUN pip install -r requirements.txt COPY file.txt /data/file.txt CMD ["python", "run.py"] 在run.py中有一个函数,用于读取文本文件: def read_file(filename): lines

My
Dockerfile
运行一个python脚本,需要从本地机器读取文本文件

Dockerfile

FROM fedeg/python-vim:2
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
COPY file.txt /data/file.txt
CMD ["python", "run.py"]
在run.py中有一个函数,用于读取文本文件:

def read_file(filename):
    lines = [line.rstrip('\n') for line in open(filename)]
    return lines
我想知道,如果我将此图像传递给其他人,他们会运行它,那么file.txt是否已经保存在图像中,或者当图像启动时,docker是否能够在此人的本地计算机中查找该file.txt


我想让docker在运行映像的任何机器上查找名称
file.txt
,这样它就可以处理另一个file.txt的内容,而不是我从本地机器提供的file.txt。

是,它保存在映像内

图像包含您在dockerfile中描述的所有更改。在那里发生的任何事情都是图像的一部分,并且可以被您将图像提供给的人使用


使用docker run或docker service创建的容器上发生的任何事情都不会影响您的图像。如果您希望docker提交一个容器以将其转换为新映像。

正如@herm所指出的那样,通过构建容器,file.txt存储在容器中

要实现所需功能,请从Dockerfile中删除副本,并在运行时使用-v选项在主机上装载包含file.txt的文件夹:

docker run -v /folder/with/file:/data image_name
其中/folder/with/file是指向包含file.txt的文件夹的路径,image_name是docker容器的名称

正在运行的容器中的/data的内容现在将是/folder/with/file文件夹的内容

编辑:

您也可以只装载文件:

docker run -v /folder/with/file/file.txt:/data/file.txt image_name
但是请注意,如果需要编辑该文件,则可能会出现问题。请参阅“将主机文件装载为数据卷”

注意:许多用于编辑文件的工具(包括vi和sed)可能会导致inode更改。自Docker v1.1.0以来,这将产生一个错误,例如“sed:无法重命名。/sedKdJ9Dy:设备或资源繁忙”。如果要编辑装入的文件,通常最容易的方法是装入父目录


因此,如果其他人拥有该映像,并且他们想要运行另一个file.txt文件,他们如何用自己的文件替换我映像中已经存在的file.txt文件?如果想法是任何人都可以添加他们的文件,那么您应该使用已装入的卷,而不是映像中的数据。您仍然可以将卷装载到容器卷,装载的数据将被使用。我刚刚记住,您还可以使用在容器和主机之间复制文件。有一个指向文档的链接,因此请自便或问一个更具体的问题。如果我当前的文件夹是
~/Desktop/docker\u test/work
,并且文本文件位于
~/Desktop/docker\u test
语法是这样的:
docker run-v~/Desktop/docker\u test/work:/data image\u name
不太。。。您想用file.txt装载文件夹,因此:
docker run-v~/Desktop/docker\u test:/data image\u name
文件名如何
docker run-v~/Desktop/docker\u test/file.txt:/data image\u name
i装载了该文件夹,但python错误是它找不到文件