繁体   English   中英

在 Docker 容器中挂载 SMB/CIFS 共享

[英]Mount SMB/CIFS share within a Docker container

我有一个在 Docker 容器中运行的 Web 应用程序。 此应用程序需要访问我们公司文件服务器(带有 Active Directory 域控制器的 Windows Server)上的一些文件。 我尝试访问的文件是为我们的客户创建的图像文件,Web 应用程序将它们显示为客户投资组合的一部分。

在我的开发机器上,我通过/etc/fstab条目安装了适当的文件夹,并且主机安装点通过--volume参数安装在 Docker 容器中。 这完美地工作。

现在我正在尝试将一个生产容器放在一起,该容器将在不同的服务器上运行,并且不依赖于安装在主机上的 CIFS 共享。 因此,我尝试将适当的条目添加到容器中的/etc/fstab文件并使用mount -a挂载它们。 我收到mount error(13): Permission denied

网上的一些研究使我找到了这篇关于 Docker 安全性的文章 如果我没看错的话,Docker 似乎明确拒绝了在容器内挂载文件系统的能力。 我尝试以只读方式安装共享,但这(不出所料)也失败了。

所以,我有两个问题:

  1. 我是否正确理解 Docker 阻止在容器内使用任何mount

  2. 谁能想到另一种方法来完成此操作,而无需在主机上安装 CIFS 共享,然后在 Docker 容器中安装主机文件夹?

是的,Docker 阻止您在容器内安装远程卷作为安全措施。 如果你信任你的镜像和运行它们的人,那么你可以使用--privileged标志和--privileged docker run来禁用这些安全措施。

此外,您可以结合使用--cap-add--cap-drop来仅为容器提供其实际需要的功能。 (请参阅文档) SYS_ADMIN功能是授予安装权限的功能。

  1. 是的
  2. 容器中有一个封闭的问题mount.cifs

https://github.com/docker/docker/issues/22197

根据哪个添加

--cap-add SYS_ADMIN --cap-add DAC_READ_SEARCH

运行选项将使 mount -t cifs 运行。

我试了一下,然后:

mount -t cifs //<host>/<path> /<localpath> -o user=<user>,password=<user>

在容器内然后工作

您可以使用smbclient命令(Samba 包的一部分)从 Docker 容器内访问 SMB/CIFS 服务器,而无需安装它,就像使用curl下载或上传文件一样。

StackExchange Unix上有一个问题可以解决这个问题,但简而言之:

smbclient //server/share -c 'cd /path/to/file; put myfile'

对于多个文件,有-T选项可以创建或提取.tar档案,但是这看起来是一个两步过程(一个创建.tar ,然后另一个在本地提取它)。 我不确定您是否可以使用管道一步完成。

您可以使用 Netshare docker 卷插件,该插件允许将远程 CIFS/Samba 挂载为卷。

不要为了挂载共享而暴露许多端口,从而降低容器的安全性。 或者以--privileged运行它

这是我解决这个问题的方法:

  • 首先在运行 docker 的服务器上挂载卷。

sudo mount -t cifs -o username=YourUserName,uid=$(id -u),gid=$(id -g) //SERVER/share ~/WinShare

在此处更改用户名、SERVER 和 WinShare。 这将询问您的 sudo 密码,然后它会询问远程共享的密码。

假设您在WinShare文件夹中创建了WinShare文件夹。 运行此命令后,您应该能够看到WinShare文件夹中的所有共享文件夹和文件。 除此之外,因为您使用uidgid标签,您将拥有写访问权限,而无需一直使用 sudo。

  • 现在您可以使用-v标记运行您的容器并在服务器和容器之间共享一个卷。

假设你像下面这样运行它。

docker run -d --name mycontainer -v /home/WinShare:/home 2d244422164

您现在应该能够访问 Windows 共享并从您的容器中对其进行修改。

要测试它,只需执行以下操作:

docker exec -it yourRunningContainer /bin/bash

cd /Home

touch testdocfromcontainer.txt

您应该testdocfromcontainer.txt在 Windows 共享中看到testdocfromcontainer.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM