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

标签 docker cifs

我使用的是 Docker 17.06.0-ce,我正在尝试在容器中挂载 CIFS 共享,但运气不佳。如果我使用 --privileged ,它有效,但这对我来说并不理想。我尝试过使用 --cap-add以及 this answer 中的建议(甚至尝试使用 --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)

Docker 中是否发生了需要 --privileged 的更改现在一直在使用这些类型的坐骑吗?还是我还缺少其他东西?

最佳答案

我开始使用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>

请注意<host>必须是主机名或 IP 地址,后跟冒号(例如 10.20.30.4: )

将卷驱动程序启用为 systemd服务

注意:如果您的操作系统不支持systemd ,需要另一种方法将其安装为服务。

$ sudo systemctl enable docker-volume-netshare

使用 docker run 中的卷和docker 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 共享,而 cifs 共享又在安装它的容器之间共享。如上所述,不要使用 docker volume create使用此卷驱动程序,因为一旦 docker-volume-netshare 卷就会丢失停止和/或重新启动(因此重新启动)。

获取帮助

$ docker-volume-netshare --help
$ docker-volume-netshare cifs --help

日志

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

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

资源

关于docker - 无法在 Docker 容器中挂载 cifs 文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45111699/

相关文章:

docker - 是否可以在不使用CI运行器的情况下登录Gitlabs容器注册表?

Docker 409 客户端错误。如何获取真实错误并查看容器中的真实日志?

unix - mount -t nfs 与 cifs

windows - 检测网络共享的 SMB 与 SMB2

linux - 为 Linux 中的 CIFS 挂载获取文件创建通知

docker - 为什么 "RUN rm/etc/nginx/conf.d/default.conf"没有成功?

asp.net - 我无法使用 "host.docker.internal:some-port"将我的 ASP .NET 应用程序从 Docker 容器连接到我的计算机主机数据库

docker - CI/CD使影像保持最新状态

Java 1.4.2 File.listFiles 无法与 CIFS 安装正常工作 - 解决方法?

linux - 尽管修改时间没有变化,但挂载共享上目录的 inode 发生了变化