docker - 来自另一个容器的 Docker 中的 mount.cifs 需要特权
问题描述
我的用例是一个转码农场,它从 Samba 共享读取输入并将其写入另一个。
mount.cifs
在 Docker 中使用需要SYS_ADMIN
和DAC_READ_SEARCH
能力。我可以使用两台主机并smbd
在一台主机上运行,并将其共享安装在另一台主机上。(两者smbd
都mount
在容器内运行,只是在不同的主机中。)
但是,我不能使用相同的mount
命令将 Samba 共享挂载到具有正在运行的容器的主机上smbd
。
编辑:它适用于 Docker 桌面,但在 Linux 主机中失败。(使用相同的docker引擎服务器版本)
TL;DR 以下 Docker Compose 失败,除非我授予它特权访问权限。
环境:在 Docker for Mac 上工作,不在裸机 Linux 上工作(Ubuntu 18.04.4 4.15.0-91-generic Docker 19.03.8 containerd 1.2.13),不在 Hyper-V 虚拟化 Linux 上工作(Ubuntu 19.04 5.0 .0-38-generic Docker 19.03.6 containerd 1.2.13)
version: '3.4'
services:
samba:
image: dperson/samba
environment:
TZ: 'EST5EDT'
networks:
- default
ports:
- "137/udp"
- "138/udp"
- "139/tcp"
- "445/tcp"
tmpfs:
- /tmp
restart: unless-stopped
stdin_open: true
tty: true
volumes:
- /samba-data
command: '/bin/bash -c "touch /samba-data/file.txt && samba.sh -s \"data;/samba-data\" -u \"bob;bob\" -p"'
mounter:
image: ubuntu
command: '/bin/bash -c "apt update && apt install -y cifs-utils && mkdir /samba-data && mount -v -o username=bob,password=bob,vers=3.0,ro,port=445 //samba/data /samba-data"'
tty: true
# privileged: true
cap_add:
- SYS_ADMIN
- DAC_READ_SEARCH
networks:
default:
我的问题,
- 为什么在同一个 Docker 主机上运行时需要特权?
- 我可以使其更具限制性(仅提供所需的内容)吗?
解决方案
您的用例中有什么需要在容器内完成安装的吗?让 docker 处理挂载怎么样?
在您的示例中,您正在启动一个容器以公开 samba 共享,并启动另一个容器以从中读取。如何简单地将两个容器绑定到同一个 docker 卷(即在 docker-compose 的顶层定义一个命名卷,并在两个服务中使用它)?这是在容器之间共享挂载的常用方式,并且不需要特权或开放端口。例如,请参阅此 SO 答案。
如果这个“共享文件夹”必须是 CIFS(因为在现实生活中它不是 samba 容器,而是 Windows 服务器?),您可以使用volume-driver
指向支持 CIFS 的docker 卷插件的参数来定义卷,例如这个或这另一个。您的“安装程序”容器将从已安装的 CIFS 共享开始。无需从容器内部安装,因此无需特权容器或扩展帽。
推荐阅读
- javascript - 让机器人在超时后删除自己的消息
- php - 使用单选按钮的 AJAX 实时搜索
- python - 检测到当前字母后在 Python 中检查下一个字母的方法?
- python - 升级 pip/安装 django - [SSL: TLSV1_ALERT_PROTOCOL_VERSION]
- java - Candy Machine Java
- python - Repeat columns as rows in python?
- image - Transparency on Imagemagick
- css - invariant scaling for CSS based image map
- spring-rabbit - How to change SimpleMessageListenerContainer's connectionFactory
- php - Access Wordpress functions.php