Это происходит из-за того, что том использует частное
распространение монтирования.Это означает, что после монтирования любые изменения, происходящие на исходной стороне (например, на стороне «хоста» в случае Docker), не будут видны под монтированием.
Есть несколько способов справиться с этим:
Сначала смонтируйте NFS, а затем запустите контейнер. Монтирование будет распространяться на контейнер, однако, как и раньше, любые изменения в монтировании не будут видны для контейнера (включая размонтирование).
Используйте "ведомое" распространение. Это означает, что после создания монтирования любые изменения на исходной стороне (хосте докеров) можно будет увидеть в цели (в контейнере). Если вы выполняете вложенные монтирования, вы захотите использовать rslave
( r
для рекурсивного).
Существует также «совместное» распространение. В этом режиме изменения точки монтирования изнутри контейнера распространяются на хост, а также наоборот. Поскольку у вашего пользователя даже не было бы прав на внесение таких изменений (если вы не добавили CAP_SYS_ADMIN), это, вероятно, не то, что вам нужно.
Вы можете установить режим распространения при создании монтирования следующим образом:
$ docker run -v /foo:/bar:private
Другой альтернативой было бы использование тома, а не монтирования хоста. Вы можете сделать это следующим образом:
$ docker volume create \
--name mynfs \
--opt type=nfs \
--opt device=: \
--opt o=addr= \
mynfs
$ docker run -it -v mynfs:/foo alpine sh
Это всегда будет выполнять монтирование в контейнере за вас, не зависит от настройки хоста каким-либо определенным образом или имеет дело с распространением монтирования.
примечание : :
в начале пути к устройству требуется, что-то странное в модуле ядра nfs.
примечание : Docker в настоящее время не разрешает
из имени DNS (это будет в 1.13), поэтому вам нужно будет указать здесь IP-адрес.
Более подробная информация о монтировании "общего поддерева": https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt