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

Mount SMB/CIFS share within a Docker container

我在 Docker 容器中有一个 Web 应用程序 运行ning。此应用程序需要访问我们公司文件服务器(具有 Active Directory 域控制器的 Windows 服务器)上的一些文件。我尝试访问的文件是为我们的客户创建的图像文件,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 中安装主机文件夹容器?

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

此外,您可以结合使用 --cap-add--cap-drop 以仅向容器提供它实际需要的功能。 (See documentation) SYS_ADMIN 能力是授予挂载权限的能力。

  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>

然后在容器内工作

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

StackExchange Unix 上有一个问题处理这个问题,但简而言之:

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

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

您可以使用 Netshare docker 卷插件,它允许 mount remote CIFS/Samba as volumes.

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

我是这样解决这个问题的:

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

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

在此处更改用户名、服务器和 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