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

     2023-03-14     72

关键词:

【中文标题】在 Docker 容器中挂载 SMB/CIFS 共享【英文标题】:Mount SMB/CIFS share within a Docker container 【发布时间】:2015-03-15 09:35:38 【问题描述】:

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

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

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

我在网上做了一点研究,找到了this article about Docker security。如果我没看错的话,Docker 似乎明确否认了在容器中挂载文件系统的能力。我尝试以只读方式安装共享,但这(不出所料)也失败了。

所以,我有两个问题:

    我是否正确理解 Docker 会阻止在容器内使用 mount

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

【问题讨论】:

您能否分享您如何修改/etc/fstab 文件以获得网络驱动器详细信息的代码?另外,你在 DOCKERFILE 中完成了这一切吗? @AnkushJain 我不经常这样做,但是当我这样做时,我通常会参考this page of documentation 我在这里写了一篇博客,以获得一个完整的基于 C#.NET 的解决方案 - coderjony.com/blogs/… 【参考方案1】:

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

此外,您可以将--cap-add--cap-drop 组合在一起,只为容器提供它实际需要的功能。 (See documentation) SYS_ADMIN 功能是授予挂载权限的功能。

【讨论】:

我已在 docker run 命令中添加了 --privileged 标志...但我的 CIFS 共享不会在容器启动时自动挂载。从容器内部,如果我放 mount -a 一切正常。有什么建议吗?谢谢。 @FabrizioA 安装卷是客人的责任。允许(或禁止)挂载卷是 Docker 的责任。如果您需要更多帮助,您应该提出一个新问题,因为这与 Kryten 的问题不同。 嗨@NathanielWaisbrot 好的,我会提出新问题。谢谢。【参考方案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>

然后在容器内工作

【讨论】:

我还需要添加--security-opt apparmor:unconfined 这对我有用,但现在又需要privileged :-/【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案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

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

【讨论】:

这可行,但需要在主机上进行更改,并且在每个容器应具有特定用户的访问权限的多用户场景中产生问题。 (OP 明确询问“[解决方案] 不依赖于主机上安装的 CIFS 共享”。) 似乎不适用于 OSX。在 rootfs 上挂载的文件系统似乎有一个特殊的例外。

在没有 noexec 选项的情况下将卷挂载到 docker 容器中

】在没有noexec选项的情况下将卷挂载到docker容器中【英文标题】:Mountvolumeintodockercontainerwithoutnoexecoption【发布时间】:2019-04-2911:35:25【问题描述】:当我侦察时,docker(docker-compose也是)使用noexec选项将卷安装到容器中,所以我... 查看详情

如何从容器中列出 Docker 挂载的卷

】如何从容器中列出Docker挂载的卷【英文标题】:HowtolistDockermountedvolumesfromwithinthecontainer【发布时间】:2015-08-1900:08:32【问题描述】:我想列出所有挂载卷的容器目录。即能够获得我从中获得的类似信息dockerinspect--format".Volumes"&l... 查看详情

Docker Windows 容器挂载命名管道

】DockerWindows容器挂载命名管道【英文标题】:DockerWindowscontainermountingnamedpipe【发布时间】:2017-12-2209:22:47【问题描述】:我正在尝试在容器中使用Jenkins并挂载命名管道来控制主机上的docker引擎。根据this博客文章,为此安装命名... 查看详情

如何在构建期间将主机卷挂载到 Dockerfile 中的 docker 容器中

】如何在构建期间将主机卷挂载到Dockerfile中的docker容器中【英文标题】:HowtomounthostvolumesintodockercontainersinDockerfileduringbuild【发布时间】:2014-11-2022:53:13【问题描述】:自从2014年提出这个问题以来,发生了许多情况,许多事情发... 查看详情

在 Windows 主机上的 docker 容器内更改挂载文件夹中的文件权限

】在Windows主机上的docker容器内更改挂载文件夹中的文件权限【英文标题】:ChangefilepermissionsinmountedfolderinsidedockercontaineronWindowsHost【发布时间】:2018-01-2000:21:27【问题描述】:免责声明/修改2几年后,对于阅读此问题的每个人-如... 查看详情

构建 docker 容器时 gcsfuse 无法挂载

】构建docker容器时gcsfuse无法挂载【英文标题】:gcsfusecannotmountwhenbuildingadockercontainer【发布时间】:2018-10-1609:02:53【问题描述】:我正在尝试在dockerbuild期间在我的容器中安装一个存储块。我读过其他线程,here、here并理解这可能... 查看详情

在主机上更改挂载卷中的文件时,不会在 docker 容器中触发文件系统事件

】在主机上更改挂载卷中的文件时,不会在docker容器中触发文件系统事件【英文标题】:Filesystemeventsnottriggeredindockercontainerwhenfilesinmountedvolumearechangedonthehost【发布时间】:2019-10-0809:59:55【问题描述】:我想在文件更改时使用nodem... 查看详情

docker-tmpfs挂载(代码片段)

...即使在容器停止后也可以保留数据。如果你在Linux上运行Docker,你有第三个选择:tmpfs mounts。使用tmpfs装载创建容器时,容器可以在容器的可写层外创建文件。与卷和绑定挂载相反,tmpfs挂载是临时的,并且仅保留在主机内存... 查看详情

在docker容器中操作docker(dind)

参考技术A就是在Docker容器中再次运行一个Docker服务.在一个容器中操作Docker在CI工具中是很常见的,如构建一个Docker镜像.但由于在容器中运行一个Docker服务会有各种问题,如镜像文件存储,嵌套的容器也并不容易维护,后来便衍生出了... 查看详情

sh容器启动脚本在容器中挂载外部的应用并在容器启动的时候启动,参数传递使用环境变量#bash#docker(代码片段)

查看详情

如何将当前工作目录挂载到 Docker 容器中?

】如何将当前工作目录挂载到Docker容器中?【英文标题】:HowtomountthecurrentworkingdirectoryontoDockercontainer?【发布时间】:2016-03-1109:19:45【问题描述】:我正在尝试将当前工作目录挂载到Docker容器上,但无法正常工作。这是我的Dockerf... 查看详情

docker中容器有必要挂载到主机上吗存储

例如dockerrun-it-v/data--namecontainer1busybox);和挂载到主机(例如dockerrun-it--namecontainer1-v/path/on/host:/datavolbusybox)但是为了使容量在容器重启甚至容器交换(旧容器被删除,创build/启动新容器)中保持不变,这两种方法都不会将卷挂载... 查看详情

我们可以在 AWS ECS docker 容器上挂载 EFS 吗?

】我们可以在AWSECSdocker容器上挂载EFS吗?【英文标题】:CanwemountEFSonAWSECSdockercontainer?【发布时间】:2018-08-0519:36:06【问题描述】:我有一个运行docker容器的ECS实例。我想在ECS上运行的docker容器上挂载EFS。那有可能吗?我可以在EC... 查看详情

docker容器数据卷挂载使用

参考技术A查看外部主机目录内容在容器内目录创建文件,在外部主机目录可以查看到在外部主机目录创建文件,在容器内目录可以查看到注意删除容器后,外部主机挂载目录里面的文件还在,没有丢失 查看详情

如何修改运行中的docker容器的端口映射和挂载目录(代码片段)

原文:如何修改运行中的docker容器的端口映射和挂载目录在dockerrun创建并运行容器的时候,可以通过-p指定端口映射规则。但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改。当dockerstart运行容器后并没有提供... 查看详情

是否可以将文件挂载到在 Google Cloud Run 中运行的 docker 容器

】是否可以将文件挂载到在GoogleCloudRun中运行的docker容器【英文标题】:IsitpossibletomountfiletothedockercontainerrunninginGoogleCloudRun【发布时间】:2021-09-2103:22:42【问题描述】:我有一个在GoogleCloudRun中运行的docker映像。镜像中的应用需... 查看详情

docker添加挂载目录或者添加端口

参考技术Adocker添加挂载目录:先在docker容器里创建目录/import1.关闭docker2.sudosu切换到root身份,cd/var/lib/docker/containers/容器id/,进入对应容器目录3.vihostconfig.json,修改如下,将容器目录/import绑定到主机/data目录:4.viconfig.v2.json,修改... 查看详情

docker管理应用程序数据容器网络(代码片段)

管理应用程序数据Docker提供三种方式将数据从宿主机挂载到容器中:?volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。?bindmounts:将宿主机上的任意位置的文件或者目录挂载到容器中。?tmpfs... 查看详情