mount.cifs в Docker из другого контейнера требует привилегий - PullRequest
1 голос
/ 21 марта 2020

Мой вариант использования - это ферма транскодирования, которая считывает входные данные из общего ресурса Samba и записывает его в другой.

Использование mount.cifs в Docker требует как SYS_ADMIN, так и DAC_READ_SEARCH. Я могу использовать два хоста, запустить smbd на одном хосте и смонтировать его общий ресурс на другом хосте. (И smbd, и mount запускаются внутри контейнеров, только на разных хостах.)

Однако я не могу, используя одну и ту же команду mount, смонтировать общий ресурс Samba на хосте с контейнером, который работает smbd.

EDIT: он работает на Docker Desktop, но не работает на хосте Linux. (С той же docker версией сервера движка)

TL; DR следующие Docker Компоновка завершается неудачей, ЕСЛИ Я не предоставляю ей привилегированный доступ.

Среды: Работа на Docker для Ма c, не работает на голом металле Linux (Ubuntu 18.04.4 4.15.0-91-generi c Docker 19.03.8 containerd 1.2.13), не работает на виртуализации Hyper-V Linux (Ubuntu 19.04 5.0.0-38-generi c 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. Можно ли сделать его более ограничительным (предоставив ему только то, что ему нужно)?

1 Ответ

2 голосов
/ 25 марта 2020

Есть ли в вашем случае что-либо, требующее установки внутри контейнера? Как насчет того, чтобы позволить docker обрабатывать монтирование?

В вашем примере вы запускаете контейнер для предоставления общего ресурса samba, а другой - для чтения из него. Как насчет простого связывания обоих контейнеров с одним и тем же томом docker (т. Е. Определить именованный том на верхнем уровне вашей docker -композиции и использовать его в обеих службах)? Это обычный способ разделения монтирования между контейнерами, для которого не требуются привилегии или открытые порты. См., Например, этот SO-ответ .

Если эта «общая папка» должна быть CIFS (потому что в реальной жизни это не контейнер samba, а сервер Windows?), Вы можете задайте громкость с помощью параметра volume-driver, указывающего на плагин docker тома , который поддерживает CIFS, например этот или этот другой . Ваш контейнер "mounter" будет начинаться с уже смонтированного ресурса CIFS. Не нужно монтировать изнутри контейнера, следовательно, нет необходимости в привилегированном контейнере или расширенных крышках.

...