Python Docker-在容器内装载Windows网络共享

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

我想在Docker中的Linux上运行一个小型Python应用程序(现在使用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)
编辑 不是复制品。该问题的解决方案引用了docker运行期间的修复程序。如果docker构建过程失败,我无法运行
--privileged


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



docker run
期间,您只能使用
--privileged
是正确的。如果没有
--privileged
,您无法执行
装载操作,因此,您无法在
docker构建过程中执行装载操作

这可能是出于设计:目标是Dockerfile基本上是自包含的;任何人都应该能够使用您的
Dockerfile
和同一目录中的其他内容生成相同的图像;将事物链接到外部挂载将违反此限制


但是,您的问题是,您有一个应用程序需要从共享中读取一些数据,因此不清楚为什么需要在
docker build
期间装载共享。听起来,您最好构建一个映像,作为docker run的一部分启动您的应用程序,并可能用于访问共享,而不是尝试将其装入容器中。

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

实际上,唯一可以做到这一点的方法是让共享在主机上可用(在Linux机器上将其放入
/etc/fstab
,或在Windows机器上将其装载到驱动器号),然后让主机将其装载,然后使其与任何其他卷一样可用于容器

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


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

我尝试运行一个基本的Ubuntu映像,在其中我安装了如下卷:
docker run-v//myshare/folder name:///myshare/folder name“
。但是,当我以交互模式进入容器时,文件夹在那里,但没有列出任何文件和文件夹。我怀疑这是因为网络共享受访问控制。我上面的用户帐户可以访问这个文件夹,当我在一个普通的Ubuntu虚拟机上挂载它时,可以浏览这些文件夹。我是否可以使用具有访问控制共享的Docker卷?问题是关于Docker的。因此,您的答案应该与Docker相关。寻找一个问题的答案,并对以“我没有使用你所指的应用程序,我也不熟悉它,但这里有一些可能不相关的东西”开头的答案进行排序,这是非常令人沮丧的…@KatherineElizabethLightsey:对不起,这个答案是三年前写的,当时Docker还是个新手,专家并不常见。此后我广泛使用Docker,因此我相应地更新了我的答案。我希望这些改进至少足以赢得否决票@Mavineous-完成,谢谢!