Mount-Bind im Container spiegelt sich nicht außerhalb des Containers wider

Mount-Bind im Container spiegelt sich nicht außerhalb des Containers wider

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 unshareund verwenden nsenter, um mit Namespaces zu experimentieren, ohne Docker einzubeziehen – z. B. unshare --mount --propagation=privatein einem Terminal ausführen, etwas mounten und dann ausführen, findmntum 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 zOption sollte etwas Ähnliches erreichen, vorausgesetzt, Ihr Host-Betriebssystem verwendet SELinux, aber ich habe es nicht ausprobiert.

verwandte Informationen