无法在Docker容器中挂载cifs文件系统

3
我正在使用 Docker 17.06.0-ce,并尝试在容器中挂载 CIFS 共享文件,但遇到了一些问题。如果我使用 --privileged,它可以工作,但这对我来说不是理想的选择。我尝试了使用 --cap-add,如此答案所建议的(甚至尝试使用--cap-add ALL),但都没有成功。

相同的挂载命令在主机系统上也可以正常工作。

以下是我尝试修改的一个简单的 Docker 文件:

FROM alpine:latest
RUN apk add --no-cache cifs-utils

以许多不同的排列方式运行,所有结果如下:

有效: docker run --rm -it --privileged cifs-test /bin/sh

无效: docker run --rm -it --cap-add SYS_ADMIN --cap-add DAC_READ_SEARCH cifs-test /bin/sh

无效: docker run --rm -it --cap-add SYS_ADMIN --cap-add DAC_READ_SEARCH --cap-add NET_ADMIN cifs-test /bin/sh

无效: docker run --rm -it --cap-add ALL cifs-test /bin/sh

还有以下命令:

mkdir /test && mount.cifs //myserver/testpath /test -o user=auser,password=somepass,domain=mydomain

除第一个run命令外,每个命令的结果如下:

mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

有什么变化导致现在需要在这些类型的挂载中始终使用--privileged吗?还是我漏掉了其他的东西?

为什么不将其挂载在主机上,并通过卷与容器共享呢? - Ricardo Branco
1
通常情况下,如果它是一个静态容器,我会这样做,但是我正在将其作为CI/CD管道的一部分进行操作,并且可能连接到超过100个不同的服务器,因此它需要是动态的。我认为我已经找到了一个解决方案,使用docker-volume-netshare插件支持即时主机挂载。需要再进行一些测试。 - Matt Zuba
1个回答

1
我已开始使用docker-volume-netshare,目前取得了良好的成功。有一些小问题,例如使用docker volume create创建的卷不是持久的,但尽管如此,这个卷驱动程序看起来还是很可用的。其中一个优点是不需要特殊的caps/privileged模式。以下是如何使用它的一些提示。 安装(Ubuntu/Debian)
$ curl -L -o /tmp/docker-volume-netshare_0.34_amd64.deb https://github.com/ContainX/docker-volume-netshare/releases/download/v0.34/docker-volume-netshare_0.34_amd64.deb
$ sudo dpkg -i /tmp/docker-volume-netshare_0.34_amd64.deb
$ rm /tmp/docker-volume-netshare_0.34_amd64.deb

配置

$ sudo vi /etc/default/docker-volume-netshare

输入单一设置
DKV_NETSHARE_OPTS="cifs --netrc=/root/"

那么

$ sudo vi /root/.netrc

按照每个主机输入以下设置:

machine <host>
  username <user>
  password <password>
  domain <domain>

请注意,<host>必须是主机名或IP地址,后面跟着一个冒号(例如:10.20.30.4:)。
将卷驱动程序作为systemd服务启用。
注意:如果您的操作系统不支持systemd,则需要另一种方法将其安装为服务。
$ sudo systemctl enable docker-volume-netshare

docker rundocker service create 中使用卷

$ sudo docker run -it --rm --mount type=volume,volume-driver=cifs,source=<myvol>,destination=<absolute-path-in-container>,volume-opt=share=<ip>:/<share> ubuntu:zesty bash
$ sudo docker service create --name <name> --mount type=volume,volume-driver=cifs,source=<myvol>,destination=<absolute-path-in-container>,volume-opt=share=<host>/<share> <image>

显然,在多个容器中使用相同的卷不是必要的,因为卷只映射到一个cifs共享,该共享在安装它的容器之间共享。如上所述,请勿使用此卷驱动程序的docker volume create,因为一旦停止和/或重新启动docker-volume-netshare(因此在重新启动时),卷就会丢失。
获取帮助
$ docker-volume-netshare --help
$ docker-volume-netshare cifs --help

日志

提示:在调试时,在/etc/default/docker-volume-netshare中使用DKV_NETSHARE_OPTS="cifs --netrc=/root/ --verbose"或停止服务并在shell中启动docker-volume-netshare cifs --netrc=/root/ --verbose

$ dmesg | tail
$ tail -50 /var/log/docker-volume-netshare.log

资源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接