【问题标题】:Calling files in the host system from a Docker container从 Docker 容器调用主机系统中的文件
【发布时间】:2020-03-12 19:38:23
【问题描述】:

我希望我能尽可能清楚地解释我的问题。我创建了一个包含 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" ]

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

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)

【问题讨论】:

  • 在错误日志中,它特别指出执行脚本PIL(python图像库)时找不到图像。我认为在脚本中修复图像的路径应该可以解决您的问题。
  • 我不知道,因为我的脚本在独立于 Docker 执行时可以工作
  • 您能否提供您的脚本中使用的代码?如果您的代码较长,请提供相关部分,例如导致错误的部分以及定义pathname的部分。
  • 当然,错误部分是这样的: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) 当然对于 python 3,必须将 raw_input() 更改为 input()
  • 从错误消息中,您似乎已将文件名作为"path+name" 的字符串传递,去掉这些引号应该可以,因为这实际上会返回完整路径。

标签: python docker volumes


【解决方案1】:

在您提供的示例中,日志表明 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。

【讨论】:

  • @user215051 答案对您有用吗?如果不是,如何调整它以更好地回答您的问题?如果是这样,你介意接受吗?这不仅可以让您回馈回答者花时间回答您的问题,而且还可以通过向用户展示您所面临问题的正确解决方案来改善 SO 社区。对于面临相同问题的其他用户来说,这可能是一笔巨大的财富。
猜你喜欢
  • 1970-01-01
  • 2017-04-16
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2015-10-05
  • 1970-01-01
相关资源
最近更新 更多