крепление привязки внутри контейнера не отражается снаружи контейнера

крепление привязки внутри контейнера не отражается снаружи контейнера

Я пытаюсь привязать каталог хоста к некоторому каталогу внутри контейнера и ожидаю, что изменения, сделанные внутри контейнера, должны отразиться на хосте.

Вот шаги, которые я выполнил

создал /hostdir на хосте и запустил контейнер Ubuntu в привилегированном режиме

[root@nhbdlin03 ~]# mkdir /hostdir
[root@nhbdlin03 ~]# docker run -itd --privileged --name ubuntu -v /hostdir:/hostdir:z ubuntu
76aebded33274e95a6f569d0831aee4df27e9f200a8fd0401448239bd6f5bf80
[root@nhbdlin03 ~]# docker exec -it ubuntu bash

создание container_dir внутри контейнера

root@76aebded3327:/# mkdir /container_dir

связывание двух каталогов (успешно)

root@76aebded3327:/# mount --bind /container_dir /hostdir

создание файла с именем hello.txt внутри /container_dir

root@76aebded3327:/# cd container_dir/
root@76aebded3327:/container_dir# touch hello.txt

он отражается внутри /hostdir, так как он привязан к монтированию /container_dir

root@76aebded3327:/container_dir# ls /hostdir/
hello.txt

выход из контейнера и проверка на хосте, отражается ли то же самое

root@76aebded3327:/container_dir# exit

[root@nhbdlin03 ~]# ls /hostdir/
[root@nhbdlin03 ~]# ls /hostdir/ | wc -l
0
[root@nhbdlin03 ~]#

содержимое не отображается.
Я что-то упускаю или делаю совсем не так, пожалуйста, помогите мне в правильном направлении.

решение1

Это сделано намеренно — крепления, выполненные внутри контейнера, не видны снаружи по нескольким причинам.

Контейнер работает в отдельном пространстве имен монтирования (а не просто chroot), и Docker, скорее всего, настраивает новое пространство имен в «приватном» режиме, отчасти для того, чтобы различные монтирования контейнера не загромождали хост findmnt, а отчасти для того, чтобы было проще разобрать все монтирования при выходе из контейнера.

(Когда все монтирования видны только изнутри пространства имен, достаточно завершить все процессы — тогда монтирования будут автоматически снесены ядром. Но если некоторые из них видны извне, то процесс «хостовой ОС» потенциально может удерживать их «в использовании».)

Вам может понадобиться что-то вроде mount --make-[r]shared /в правильное время, чтобы внутренние крепления были видны снаружи. У меня нет более точного ответа прямо сейчас.

Вы можете использовать инструменты unshareи nsenterдля экспериментов с пространствами имен без использования Docker — например, запустить unshare --mount --propagation=privateв одном терминале, смонтировать что-либо, а затем запустить его и findmntпосмотреть, как он выдает разные результаты «внутри» и «вне» процесса «unshare».

решение2

Для меня сработало то, что я сделал монтирование Docker bind shared, как описано вэтот ответна аналогичный вопрос «Как предоставить хосту точку монтирования контейнера?»:

-v /hostdir:/hostdir:shared

В соответствии сДокументы Dockerэта zопция должна дать аналогичный результат, если ваша хостовая ОС использует SELinux, но я этого не пробовал.

Связанный контент