Im Andockfenster haben Dateien, die in Containern erstellt werden, oft unberechenbare Eigenschaften, wenn sie vom Host aus untersucht werden. Der Besitzer der Dateien auf einem Volume ist standardmäßig root (uid 0). Sobald jedoch nicht root-Benutzerkonten in den Container eingebunden und in das Dateisystem geschrieben werden, werden die Besitzer aus der Hostperspektive mehr oder weniger zufällig.Docker und --userns-remap, wie Volume Berechtigungen verwalten, um Daten zwischen Host und Container zu teilen?
Es ist ein Problem, wenn Sie mit dem gleichen Benutzerkonto, das die docker-Befehle aufruft, auf Volumendaten vom Host zugreifen müssen.
Typische Abhilfen
- zwingt Benutzer UIDs bei der Erstellung in Dockerfiles (nicht portabel)
- die UID des Host-Benutzer an den
docker run
Befehl als eine Umgebungsvariable vorbei und dann einigechown
Befehle ausführen zu werden die Volumes in einem Einstiegsskript.
Diese beiden Lösungen können einige Kontrolle über die tatsächlichen Berechtigungen außerhalb des Containers geben.
Ich erwartete User-Namespaces, um die endgültige Lösung für dieses Problem zu sein. Ich habe einige Tests mit der kürzlich veröffentlichten Version 1.10 und --userns-remap set auf meinem Desktop-Account durchgeführt. Ich bin mir jedoch nicht sicher, ob dies den Besitz von Dateien auf gemounteten Volumes erleichtern kann, ich befürchte, dass es tatsächlich das Gegenteil sein könnte.
Angenommen, fange ich an diesem Basiscontainer
docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit
Und dann den Inhalt aus dem Host inspizieren:
ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/
-rw-r--r-- 1 100000 100000 6 Feb 8 19:43 test.txt
Diese Zahl '100000' ist eine Unter UID meines Host-Benutzer, aber seit Es entspricht nicht der UID meines Benutzers, ich kann die test.txt trotzdem nicht ohne Berechtigungen bearbeiten. Dieser Subbenutzer scheint keine Affinität zu meinem eigentlichen regulären Benutzer außerhalb von Docker zu haben. Es ist nicht zugeordnet.
Die zuvor erwähnten Problemumgehungen, die aus dem Ausrichten von UIDs zwischen dem Host und dem Container bestanden, funktionieren aufgrund der Zuordnung UID->sub-UID
im Namespace nicht mehr.
Dann gibt es eine Möglichkeit zum Ausführen von docker mit Benutzer-Namespace aktiviert (für eine verbesserte Sicherheit), während es weiterhin für den Host-Benutzer Docker ermöglicht, die Dateien auf Volumes besitzen zu besitzen?
Ich denke, dass, wenn Sie Volumes zwischen dem Host und dem Container freigeben, Benutzer Namespaces sind * nicht * wird Teil der Lösung sein. Ihre zweite Option ("Übergabe der UID des Host-Benutzers an den Befehl docker run als Umgebungsvariable und Ausführung einiger chown-Befehle auf den Volumes in einem Einstiegsskript") ist wahrscheinlich die beste Lösung. – larsks
Docker selbst scheint nicht zu ermutigen, Host-mounted beschreibbare Volumes zu verwenden. Da ich keinen Cloud-Dienst betreibe und nur meine eigenen vertrauenswürdigen Bilder verwende, frage ich mich jetzt, ob der Sicherheitsvorteil von Benutzer NS es wert ist, so viel Bequemlichkeit zu opfern. –
@ StéphaneC. Hast du vielleicht einen besseren Ansatz gefunden? – EightyEight