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

时间:2015-01-16 17:45:22

标签: linux windows docker mount cifs

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

在我的开发机器上,我通过/etc/fstab中的条目安装了相应的文件夹,主机安装点通过--volume参数安装在Docker容器中。这非常有效。

现在我正在尝试将一个生产容器组合在一起,该容器将在不同的服务器上运行,并且不依赖于在主机上安装的CIFS共享。所以我尝试将相应的条目添加到容器中的/etc/fstab文件中。用mount -a安装它们。我得到mount error(13): Permission denied

在线进行的一项小型研究让我this article about Docker security。如果我正确读取此内容,似乎Docker明确拒绝在容器中挂载文件系统的能力。我尝试以只读方式挂载股票,但这(不出所料)也失败了。

所以,我有两个问题:

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

  2. 有没有人能想到另一种方法来实现这个没有在主机上挂载CIFS共享然后将主机文件夹挂载到Docker容器中?

5 个答案:

答案 0 :(得分:30)

是的,Docker阻止您在容器内安装远程卷作为安全措施。如果您信任自己的图片以及运行图片的人员,则可以使用--privileged标记docker run来禁用这些安全措施。

此外,您可以将--cap-add--cap-drop结合使用,只为容器提供实际需要的功能。 (See documentation) SYS_ADMIN功能是授予安装权限的功能。

答案 1 :(得分:13)

  1. 容器内存在 mount.cifs
  2. 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>

    容器内的

    然后工作

答案 2 :(得分:3)

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

StackExchange Unix上有一个问题可以解决,但总之:

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

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

答案 3 :(得分:0)

您可以使用Netshare码头工人卷插件,该插件可以mount remote CIFS/Samba as volumes.

答案 4 :(得分:0)

不要通过暴露许多端口来挂载共享来降低容器的安全性。或者以--privileged

的身份运行

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

  • 首先将卷安装在运行docker的服务器上。

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

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

假设您在主文件夹中创建了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

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