Монтирование каталога NFS в том хоста, который используется совместно с Docker

Если вас устраивает решение с файлами конфигурации: Установите devilspie2 (Ubuntu: sudo apt install devilspie2 ) и создайте ~ / .config / devilspie2 / smplayer .lua со следующим содержанием:

if (get_application_name() == "SMPlayer") then
  pin_window();
end  

Затем запустите devilspie2 и, если все работает, как ожидалось, убедитесь, что KDE запускает его после входа в систему.

8
30.06.2016, 03:37
3 ответа

Это происходит из-за того, что том использует частное распространение монтирования.Это означает, что после монтирования любые изменения, происходящие на исходной стороне (например, на стороне «хоста» в случае Docker), не будут видны под монтированием.

Есть несколько способов справиться с этим:

  1. Сначала смонтируйте NFS, а затем запустите контейнер. Монтирование будет распространяться на контейнер, однако, как и раньше, любые изменения в монтировании не будут видны для контейнера (включая размонтирование).

  2. Используйте "ведомое" распространение. Это означает, что после создания монтирования любые изменения на исходной стороне (хосте докеров) можно будет увидеть в цели (в контейнере). Если вы выполняете вложенные монтирования, вы захотите использовать rslave ( r для рекурсивного).

Существует также «совместное» распространение. В этом режиме изменения точки монтирования изнутри контейнера распространяются на хост, а также наоборот. Поскольку у вашего пользователя даже не было бы прав на внесение таких изменений (если вы не добавили CAP_SYS_ADMIN), это, вероятно, не то, что вам нужно.

Вы можете установить режим распространения при создании монтирования следующим образом:

$ docker run -v /foo:/bar:private

Другой альтернативой было бы использование тома, а не монтирования хоста. Вы можете сделать это следующим образом:

$ docker volume create \
    --name mynfs \
    --opt type=nfs \
    --opt device=:<nfs export path> \
    --opt o=addr=<nfs host> \
    mynfs
$ docker run -it -v mynfs:/foo alpine sh

Это всегда будет выполнять монтирование в контейнере за вас, не зависит от настройки хоста каким-либо определенным образом или имеет дело с распространением монтирования.
примечание : : в начале пути к устройству требуется, что-то странное в модуле ядра nfs.
примечание : Docker в настоящее время не разрешает из имени DNS (это будет в 1.13), поэтому вам нужно будет указать здесь IP-адрес.

Более подробная информация о монтировании "общего поддерева": https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt

19
27.01.2020, 20:08

Включите распространение общего монтирования на томе, добавив флаг: shared в конце аргумента тома:

docker run --rm -it -v /tmp:/mnt/tmp:shared alpine sh

Если Docker был установлен с помощью диспетчера пакетов или сценария установки для systemd, вам может потребоваться настроить аргумент демона MountFlags . Для этого найдите файл docker.service:

$ sudo find /etc -name "docker.service"

В моем случае в Ubuntu 16.04 он находился в /etc/systemd/system/multi-user.target.wants/docker.service. Отредактируйте этот файл с помощью vi или nano и убедитесь, что параметр MountFlags гласит:

MountFlags=shared

Сохраните файл, перезагрузите аргументы демона и перезапустите докер:

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Теперь вы можете установить флаг распространения общего монтирования на томах, когда с помощью «docker run».

4
27.01.2020, 20:08

Начиная с докера 17.06, вы можете монтировать общие ресурсы NFS в контейнер непосредственно при его запуске, без необходимости дополнительных действий. возможности

export NFS_VOL_NAME=mynfs NFS_LOCAL_MNT=/mnt/mynfs NFS_SERVER=my.nfs.server.com NFS_SHARE=/my/server/path NFS_OPTS=vers=4,soft

docker run --mount \
  "src=$NFS_VOL_NAME,dst=$NFS_LOCAL_MNT,volume-opt=device=:$NFS_SHARE,\"volume-opt=o=addr=$NFS_SERVER,$NFS_OPTS\",type=volume,volume-driver=local,volume-opt=type=nfs" \
  busybox ls $NFS_LOCAL_MNT

Кроме того, вы можете создать том перед контейнером:

docker volume create --driver local \
  --opt type=nfs --opt o=addr=$NFS_SERVER,$NFS_OPTS \
  --opt device=:$NFS_SHARE $NFS_VOL_NAME

docker run --rm -v $NFS_VOL_NAME:$NFS_LOCAL_MNT busybox ls $NFS_LOCAL_MNT

Получил подсказку от https://github.com/moby/moby/issues/28809

4
27.01.2020, 20:08

Теги

Похожие вопросы