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

Kry*_*ten 34 linux windows mount cifs docker

我有一个在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容器中?

Nat*_*rot 35

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

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


Wol*_*ahl 17

  1. 容器中有一个封闭的问题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>

在容器内然后工作

  • 不久前这对我有用,但现在它再次需要“特权”:-/ (5认同)

Mal*_*ous 12

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

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

smbclient //server/share -c 'cd /path/to/file; put myfile'
Run Code Online (Sandbox Code Playgroud)

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


nPc*_*omp 5

不要仅仅为了挂载共享而暴露许多端口,从而降低容器的安全性。或者通过运行它作为--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

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

  • 这是可行的,但需要在主机上进行更改,并且在每个容器应具有特定用户的访问权限的多用户场景中会出现问题。(OP 明确询问“[解决方案]不依赖于主机上安装的 CIFS 共享”。) (9认同)