我有一个小型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网络共享的正确方法是什么?
答案 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来访问共享,而不是试图将它挂载到容器中。