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

时间:2015-05-27 21:16:59

标签: python linux windows docker boot2docker

我有一个小型Python应用程序,我想在Docker上运行Linux(现在使用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网络共享的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

Docker仅抽象出应用程序,而安装文件系统则发生在内核级别,因此不能仅限于容器内部。使用mkdir -p "//myshare/folder name"时,挂载会在主机上发生,然后传递到容器中。

实际上,唯一可以做到这一点的方法是让主机上的共享可用(将它放在Linux机器上的//中,或者将它安装到Windows机器上的驱动器号上)并拥有主机安装它,然后像使用任何其他卷一样使它可用于容器。

另请注意,/是一个半无效的路径 - 大多数shell会将/myshare/folder name压缩为/mnt/myshare-foldername,因此您可能无法访问名为{{1}的文件夹因为Linux系统的根目录通常不是放置文件的位置。您可能会使用smbclient或类似代码获得更好的成功。

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

答案 1 :(得分:0)

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

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

但是,您的问题是,您的应用程序需要从共享中读取一些数据,因此不清楚为什么需要在docker build期间安装共享。听起来你最好建立一个将docker run的一部分启动你的应用程序的图像,并可能使用docker volumes来访问共享,而不是试图将它挂载到容器中。