Docker - 在容器内挂载Windows网络共享[复制]

问题描述 投票:1回答:2

这个问题在这里已有答案:

我有一个小的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网络共享的正确方法是什么?


python linux windows docker boot2docker
2个回答
2
投票

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中也是如此。


0
投票

你是正确的,你只能在--privileged期间使用docker run。如果没有mount,你不能执行--privileged操作,ergo,你不能在docker build进程中执行mount操作。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.