2017-04-14 2490 views
2

我的Dockerfile运行一个python脚本,需要从本地机器读取文本文件。当容器运行时,Docker从本地系统读取文件

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文件?

我想要的是码头在任何运行图像的机器上寻找名称file.txt,因此它可以处理另一个file.txt的内容而不是我从本地机器提供的file.txt的内容。

回答

1

是的,它保存在图像内。

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

任何发生在您使用码头运行或码头服务创建的容器上的事件都不会影响您的图像。如果你想让Docker提交一个容器来将它变成一个新的图像。

+0

因此,如果其他人拥有图像,并且他们有不同的file.txt他们想运行,他们如何用他们的图像替换已经在我的图像file.txt? – jxn

+0

如果这个想法是任何人都可以添加他们的文件,你应该使用一个安装的卷,而不是在图像中的数据。您仍然可以将卷装载到容器卷,并且将使用您安装的数据。 – herm

+0

我只记得你还可以使用[docker cp](https://docs.docker.com/engine/reference/commandline/cp/)在容器和主机之间复制文件 – herm

1

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

达到你想要的东西,从Dockerfile删除复制,而是安装包含file.txt的主机上运行时-v选项的文件夹:

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

其中/文件夹/带/ 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到位可能导致inode更改的工具。由于Docker v1.1.0,这将产生一个错误,如“sed:无法重命名./sedKdJ9Dy:设备或资源繁忙”。在你想编辑挂载文件的情况下,通常最容易挂载父目录。

+0

如果我的当前文件夹是“〜/ Desktop/docker_test/work”,并且文本文件在'〜/ Desktop/docker_test'中,语法如下:'docker run -v〜/ Desktop/docker_test/work:/ data image_name' – jxn

+0

不太...你想用file.txt安装这个文件夹:'docker run -v〜/ Desktop/docker_test:/ data image_name' – saxitoxin

+0

那么文件名呢? 'docker run -v〜/ Desktop/docker_test/file.txt:/ data image_name'我挂载了这个文件夹,但是python的错误在于它找不到文件 – jxn

相关问题