Это происходит потому, что том использует private
распространение монтирования. Это означает, что после монтирования любые изменения, происходящие на стороне источника (например, на стороне хоста в случае Docker), не будут видны под монтированием.
Есть несколько способов справиться с этим:
Сначала смонтируйте NFS, затем запустите контейнер. Монтирование будет распространяться на контейнер, однако, как и прежде, любые изменения в монтировании не будут видны контейнеру (включая размонтирование).
Используйте «рабское» распространение. Это означает, что после создания монтирования любые изменения на стороне источника (хост-докер) будут видны в цели (в контейнере). Если вы делаете вложенные монтирования, вы захотите использовать 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 в настоящее время не разрешает <nfs host>
DNS-имя (оно будет в 1.13), поэтому вам нужно указать здесь IP-адрес.
Более подробная информация о монтировании «разделяемого поддерева»: https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt