【问题标题】:Docker - Mount Windows Network Share Inside Container [duplicate]Docker - 在容器内挂载 Windows 网络共享 [重复]
【发布时间】:2015-08-10 04:17:18
【问题描述】:

我有一个小型 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


    【解决方案1】:

    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 中也很常见。

    【讨论】:

    • 问题是关于 Docker 的。因此,您的答案应该与 Docker 相关。寻找问题的答案并不得不对以“我没有使用过你所指的应用程序,我不熟悉它,但这里有一些东西这可能不相关……”
    • @KatherineElizabethLightsey:对不起,这个答案是三年前写的,当时 Docker 还很新,专家还不常见。我已经广泛使用 Docker,所以我相应地更新了我的答案。我希望这些改进足以至少赢得反对票!
    • @Mavineous - 完成,谢谢!
    【解决方案2】:

    您是正确的,您只能在docker run 期间使用--privileged。没有--privileged就不能执行mount操作,所以在docker build过程中不能执行挂载操作。

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

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

    【讨论】:

    • 我试图运行一个基本的 Ubuntu 映像,我在其中安装了这样的卷:docker run -v "//myshare/folder name":"//myshare/folder name"。但是,当我以交互模式进入容器时,文件夹在那里,但没有列出任何文件和文件夹。我怀疑这是因为网络共享是访问控制的。我上面的用户帐户可以访问此文件夹,并且可以在我将其安装在常规 Ubuntu VM 上时导航文件夹。无论如何我可以使用具有访问控制共享的 Docker 卷吗?
    猜你喜欢
    • 2017-02-16
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2020-01-02
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多