首页 > 解决方案 > 从 Docker 容器调用主机系统中的文件

问题描述

我希望我能尽可能清楚地解释我的问题。我创建了一个包含 python 脚本的 Docker 映像,在此脚本中,要求用户提供希望操作的文件的路径和名称。

这是我的 Dockerfile:

FROM python:2.7.16

ADD my_script.py /

RUN pip install Pillow
RUN pip install numpy ==1.16.2

CMD [ "python", "./my_script.py" ]

由于无法从容器访问主机系统中的文件,我认为最好创建一个卷以在主机和容器之间共享文件,并且我保存了一些文件以在“host-data”文件夹中尝试我的脚本,所以我做了:

docker run -d -P --name script-container -v ~/host-data/:container-data my_image

它一直有效,直到给出文件的路径和名称,并且我不断收到此错误消息

Traceback (most recent call last):
  File "./my_script.py", line 14, in <module>
    image = Image.open("path+name")
  File "/usr/local/lib/python2.7/site-packages/PIL/Image.py", line 2766, in open
Path: File name:     fp = builtins.open(filename, "rb")
IOError: [Errno 2] No such file or directory: 'path+name'

我对 Docker 比较陌生,所以我非常感谢一些帮助。

这是发生错误的代码部分。

from __future__ import division 
from PIL import Image
import numpy as np 
path = str(raw_input("path to the file ")) 
name = str(raw_input("name of the file ")) 
image = Image.open(path + nombre)

标签: pythondockervolumes

解决方案


在您提供的示例中,日志指出 PIL 无法在“路径+名称”处打开文件。看起来你打算连接变量pathname就像这样

image = Image.open(path + name)

但是,您将串联用引号括起来,从而产生"path+name". 当然,这只是猜测,因为我不知道您的代码是什么样的。

我还应该在这里指出,使用os.path.join连接路径通常是更好的做法,因为它比简单地添加它们更健壮。在这种情况下,您的代码将变为

image = Image.open(os.path.join(path, name))

另外,我看到您使用的是 Python 2.7。如果可能的话,我建议过渡到 Python 3,因为 Python 2 将在 2020 年达到 EOL。


推荐阅读