Ich versuche, das Hostverzeichnis an ein Verzeichnis innerhalb des Containers zu binden und erwarte, dass sich die innerhalb des Containers vorgenommenen Änderungen auf dem Host widerspiegeln.
Hier sind die Schritte, die ich befolgt habe
/hostdir auf dem Host erstellt und Ubuntu-Container im privilegierten Modus ausgeführt
[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
Erstellen eines Containerverzeichnisses innerhalb des Containers
root@76aebded3327:/# mkdir /container_dir
Verbinden der beiden Verzeichnisse (erfolgreich)
root@76aebded3327:/# mount --bind /container_dir /hostdir
Erstellen einer Datei mit dem Namen hello.txt in /container_dir
root@76aebded3327:/# cd container_dir/
root@76aebded3327:/container_dir# touch hello.txt
es wird in /hostdir reflektiert, da es an /container_dir gebunden ist
root@76aebded3327:/container_dir# ls /hostdir/
hello.txt
Container verlassen und auf dem Host prüfen, ob das gleiche widergespiegelt wird
root@76aebded3327:/container_dir# exit
[root@nhbdlin03 ~]# ls /hostdir/
[root@nhbdlin03 ~]# ls /hostdir/ | wc -l
0
[root@nhbdlin03 ~]#
Der Inhalt wird nicht wiedergegeben.
Ich übersehe etwas oder mache etwas völlig falsch. Bitte helfen Sie mir in die richtige Richtung.
Antwort1
Das ist so beabsichtigt – Mounts, die innerhalb eines Containers durchgeführt werden, sind aus mehreren Gründen von außen nicht sichtbar.
Der Container wird in einem separaten Mount-Namespace ausgeführt (nicht nur in einem einfachen Chroot), und Docker konfiguriert den neuen Namespace höchstwahrscheinlich im „privaten“ Modus, teilweise um zu verhindern, dass die verschiedenen Mounts des Containers den des Hosts überladen findmnt
, und teilweise um die Demontage aller Mounts beim Beenden des Containers zu erleichtern.
(Wenn alle Mounts nur innerhalb des Namespace sichtbar sind, reicht es aus, alle Prozesse zu beenden – dann werden die Mounts automatisch vom Kernel abgebaut. Wenn einige davon jedoch extern sichtbar sind, könnte ein „Host-OS“-Prozess sie möglicherweise „in Gebrauch“ halten.)
Möglicherweise benötigen Sie etwas wie „ mount --make-[r]shared /
zum richtigen Zeitpunkt interne Mounts extern sichtbar machen“. Eine genauere Antwort habe ich derzeit nicht.
Sie können die Tools unshare
und verwenden nsenter
, um mit Namespaces zu experimentieren, ohne Docker einzubeziehen – z. B. unshare --mount --propagation=private
in einem Terminal ausführen, etwas mounten und dann ausführen, findmnt
um zu sehen, ob es „innerhalb“ und „außerhalb“ des „Unshare“-Prozesses unterschiedliche Ergebnisse meldet.
Antwort2
Was bei mir funktioniert hat, war die Einrichtung des Docker-Bind-Mounts shared
, wie indiese Antwortzu einer ähnlichen Frage „Wie kann ich den Einhängepunkt eines Containers für den Host verfügbar machen?“:
-v /hostdir:/hostdir:shared
EntsprechendDocker-DokumenteDie z
Option sollte etwas Ähnliches erreichen, vorausgesetzt, Ihr Host-Betriebssystem verwendet SELinux, aber ich habe es nicht ausprobiert.