这个问题在这里已有答案:
我有一个小的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网络共享的正确方法是什么?
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
上传或下载文件一样,通常在Dockerfiles中也是如此。
你是正确的,你只能在--privileged
期间使用docker run
。如果没有mount
,你不能执行--privileged
操作,ergo,你不能在docker build
进程中执行mount操作。
这可能是设计目标:目标是Dockerfile基本上是自包含的;任何人都应该能够在同一目录中使用你的Dockerfile
和其他内容来生成相同的图像;将东西连接到外部装载会违反此限制。
但是,您的问题是您有一个应用程序需要从共享中读取一些数据,因此不清楚为什么需要在docker build
期间安装共享。听起来你最好建立一个图像来启动你的应用程序作为docker run
的一部分,并可能使用docker volumes来访问共享而不是试图将它安装在容器内。