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

时间:2017-04-14 18:35:46

标签: 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我的本地机器。

2 个答案:

答案 0 :(得分:2)

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

要实现您想要的效果,请从Dockerfile中删除COPY,然后在运行时使用-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

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

  

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

答案 1 :(得分:1)

是的,它保存在图像中。

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

使用docker run或docker服务创建的容器上发生的任何事情都不会影响您的图像。如果你想要,你可以使用docker提交容器将其转换为新图像。