【问题标题】:Unable to mount cifs filesystem in Docker container无法在 Docker 容器中挂载 cifs 文件系统
【发布时间】:2017-12-20 01:41:13
【问题描述】:

我在 Docker 17.06.0-ce 上,我正在尝试将 CIFS 共享挂载到容器中,只是运气不错。如果我使用--privileged,它可以工作,但这对我来说并不理想。我尝试过使用--cap-add 以及this answer 中的建议(即使尝试使用--cap-add ALL 也没有成功。

同样的 mount 命令在主机系统上也能正常工作。

这是我尝试过的一个简单的 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)

Docker 中是否发生了一些变化,现在这些类型的挂载需要--privileged?还是我还缺少其他东西?

【问题讨论】:

  • 为什么不把它挂载到宿主机中,并在一个卷中与容器共享呢?
  • 如果它是一个静态容器,我通常会这样做,但是我将其作为 CI/CD 管道的一部分,并且可能连接到 100 多个不同的服务器,所以它需要动态的。我想我找到了一个使用 docker-volume-netshare 插件的解决方案,该插件支持动态安装主机。需要再测试一下。

标签: docker cifs


【解决方案1】:

到目前为止,我开始使用docker-volume-netshare 并取得了很好的成功。有一些小问题,比如使用docker volume create 创建的卷不是持久的,但看起来这个卷驱动程序非常有用。一个优点是不需要特殊的上限/特权模式。以下是有关如何使用它的一些提示。

安装 (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>

请注意,&lt;host&gt; 必须是主机名或 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

资源

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多