Я пытаюсь привязать каталог хоста к некоторому каталогу внутри контейнера и ожидаю, что изменения, сделанные внутри контейнера, должны отразиться на хосте.
Вот шаги, которые я выполнил
создал /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, но я этого не пробовал.