首页 > 解决方案 > 来自另一个容器的 Docker 中的 mount.cifs 需要特权

问题描述

我的用例是一个转码农场,它从 Samba 共享读取输入并将其写入另一个。

mount.cifs在 Docker 中使用需要SYS_ADMINDAC_READ_SEARCH能力。我可以使用两台主机并smbd在一台主机上运行,​​并将其共享安装在另一台主机上。(两者smbdmount在容器内运行,只是在不同的主机中。)

但是,我不能使用相同的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:

我的问题,

  1. 为什么在同一个 Docker 主机上运行时需要特权?
  2. 我可以使其更具限制性(仅提供所需的内容)吗?

标签: dockersamba

解决方案


您的用例中有什么需要在容器内完成安装的吗?让 docker 处理挂载怎么样?

在您的示例中,您正在启动一个容器以公开 samba 共享,并启动另一个容器以从中读取。如何简单地将两个容器绑定到同一个 docker 卷(即在 docker-compose 的顶层定义一个命名卷,并在两个服务中使用它)?这是在容器之间共享挂载的常用方式,并且不需要特权或开放端口。例如,请参阅此 SO 答案

如果这个“共享文件夹”必须是 CIFS(因为在现实生活中它不是 samba 容器,而是 Windows 服务器?),您可以使用volume-driver指向支持 CIFS 的docker 卷插件的参数来定义卷,例如这个这另一个。您的“安装程序”容器将从已安装的 CIFS 共享开始。无需从容器内部安装,因此无需特权容器或扩展帽。


推荐阅读