2015-01-16 89 views
15

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

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

现在我试图把一个生产容器放在一起,它将运行在不同的服务器上,并且不依赖主机上挂载的CIFS共享。所以我试图将相应的条目添加到容器&中的/etc/fstab文件中,并使用mount -a进行装载。我得到mount error(13): Permission denied

一个小小的研究网络导致我this article about Docker security。如果我正确地阅读它,看起来Docker显式拒绝在容器中装载文件系统的能力。我试图以只读方式挂载股票,但这(意外)也失败了。

所以,我有两个问题:

  1. 难道我的理解是,码头工人防止任何使用mount内部容器是否正确?

  2. 任何人都可以想出另一种方法来完成这个没有在主机上安装CIFS共享,然后将主机文件夹挂载到Docker容器中?

回答

15

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

此外,您可以合并--cap-add--cap-drop,仅为容器提供实际需要的功能。 (See documentation)SYS_ADMIN功能是授予挂载特权的功能。

+0

感谢您的帮助! – Kryten

+0

我已经将--privileged标志添加到docker运行命令中......但我的CIFS共享不会在容器启动时自动加载。从容器里面,如果我把mount -a全部正常工作。 有什么建议吗?谢谢。 –

+0

@FabrizioA安装卷是客人的责任。允许(或不允许)安装卷是Docker的责任。如果您需要更多帮助,您应该提出一个新问题,因为这与Kryten的问题不一样。 –

6
  1. 有一个容器

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

mount.cifs根据该一个封闭的问题添加

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

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

我尝试过了,并且:

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

在容器内即可工作

+0

另请参阅https://github.com/moby/moby/issues/31452 –