python - Docker - 在容器内挂载 Windows 网络共享

标签 python linux windows docker boot2docker

<分区>

我有一个小型 Python 应用程序,我想在 Linux 上的 Docker 中运行(目前使用 boot2docker)。此应用程序从我的 Windows 网络共享中读取一些数据,这在使用网络路径的 Windows 上运行良好,但在 Linux 上失败。在做了一些研究之后,我想出了如何在 Ubuntu 上挂载 Windows 共享。我正在尝试实现 dockerfile 以便它为我设置共享,但到目前为止没有成功。下面是我目前的做法,在构建过程中遇到 mount 命令不允许的操作。

#Sample Python functionality
import os
folders = os.listdir(r"\\myshare\folder name")

#Dockerfile
RUN apt-get install cifs-utils -y
RUN mkdir -p "//myshare/folder name"
RUN mount -t cifs "//myshare/folder name" "//myshare/folder name" -o username=MyUserName,password=MyPassword

#Error at mount during docker build
#"mount: error(1): Operation not permitted"
#Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

编辑 不是 Mount SMB/CIFS share within a Docker container 的副本.该问题的解决方案引用了 docker run 期间的修复。如果 docker 构建过程失败,我无法运行 --privileged


问:在 Docker 容器中挂载 Windows 网络共享的正确方法是什么?


最佳答案

Docker 仅抽象出应用程序,而挂载文件系统发生在内核级别,因此不能仅限于发生在容器内。使用 --privileged 时,挂载发生在主机上,然后传递到容器中。

真正做到这一点的唯一方法是让共享在主机上可用(在 Linux 机器上把它放在 /etc/fstab 中,或者在 Windows 上将它挂载到一个驱动器盘符机)并让主机挂载它,然后像对待任何其他卷一样将其提供给容器。

还要记住 mkdir -p "//myshare/folder name" 是一个半无效的路径 - 大多数 shell 会将 // 压缩成 / 因此您可能无法访问名为 /myshare/folder name 的文件夹,因为 Linux 系统的根目录通常不是您放置文件的位置。使用 /mnt/myshare-foldername 或类似的方法可能会取得更好的成功。

另一种方法是找到一种无需挂载文件即可访问文件的方法。例如,您可以使用 smbclient 命令在 Docker 容器和 SMB/CIFS 共享之间传输文件,而无需挂载它,这将在 Docker 容器内工作,就像您可以使用 wgetcurl 上传或下载文件,这在 Dockerfiles 中也很常见。

关于python - Docker - 在容器内挂载 Windows 网络共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30493300/

相关文章:

python - Flask - 外部可见的开发服务器

python - 为什么表达式 (0==0 & 1==1) 的计算结果为 False?

php - 如何在窗口服务器上自动重启apache服务器?

c++ - GlBufferDataARB 给我内存问题

python - 在 Windows 上使用 python 自动 NTLM

python - 在 Python 中查找字典的最小键时的特殊情况

python - 多行为空时如何进行合并

Linux -/usr/local 或/var 用于应用程序数据?

linux - 测试 Linux 中是否安装了驱动器

linux - 将输入/传递文本文件 example.txt 发送到 Linux 中的 Install.sh