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

我的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服务创build的容器上发生的任何事情都不会影响您的图像。 如果你想让Docker提交一个容器,把它变成一个新的图像。

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

为了实现你想要的,从Dockerfile中删除COPY,而是在运行时使用-v选项将包含file.txt的文件夹挂载到主机上:

 docker run -v /folder/with/file:/data image_name 

其中/ folder / with / file是包含file.txt的文件夹的path,image_name是您的docker容器的名称。

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

编辑:

你也可以只装载文件:

 docker run -v /folder/with/file/file.txt:/data/file.txt image_name 

但是请注意,如果您需要编辑文件,这可能会出现问题。 请参阅Docker文档 “将主机文件安装为数据卷”

注意:用于编辑文件(包括vi和sed-in-place)的许多工具可能会导致inode更改。 由于Docker v1.1.0,这将产生一个错误,如“sed:无法重命名./sedKdJ9Dy:设备或资源繁忙”。 在你想编辑挂载文件的情况下,反而挂载父目录通常是最容易的。