Kurz gesagt: Ich versuche, ein Host-Verzeichnis in Docker bereitzustellen, kann dann aber nicht aus dem Container heraus darauf zugreifen, selbst wenn die Zugriffsberechtigungen gut aussehen.
Die Details:
ich mache
sudo docker run -i -v /data1/Downloads:/Downloads ubuntu bash
und dann
ls -al
Es gibt mir:
total 8892
drwxr-xr-x. 23 root root 4096 Jun 18 14:34 .
drwxr-xr-x. 23 root root 4096 Jun 18 14:34 ..
-rwxr-xr-x. 1 root root 0 Jun 18 14:34 .dockerenv
-rwx------. 1 root root 9014486 Jun 17 22:09 .dockerinit
drwxrwxr-x. 18 1000 1000 12288 Jun 16 11:40 Downloads
drwxr-xr-x. 2 root root 4096 Jan 29 18:10 bin
drwxr-xr-x. 2 root root 4096 Apr 19 2012 boot
drwxr-xr-x. 4 root root 340 Jun 18 14:34 dev
drwxr-xr-x. 56 root root 4096 Jun 18 14:34 etc
drwxr-xr-x. 2 root root 4096 Apr 19 2012 home
und viel mehr Zeilen wie diese (ich denke, das ist der relevante Teil).
Wenn ich mache
cd /Downloads
ls
Das Ergebnis ist
ls: cannot open directory .: Permission denied
Der Host ist Fedora 20 mit Docker 1.0.0 und go1.2.2.
Was läuft falsch?
quelle
-v $(pwd):/app:ro,Z
. Dies sollte als die richtige Antwort markiert werden.Es ist ein SELinux- Problem.
Sie können vorübergehend ausstellen
auf dem Host, um durch Ausführen auf eine SELinux-Regel zuzugreifen oder diese hinzuzufügen
quelle
WARNUNG: Diese Lösung birgt Sicherheitsrisiken.
Versuchen Sie, den Container als privilegiert auszuführen:
Eine andere Option (die ich nicht ausprobiert habe) wäre, einen privilegierten Container zu erstellen und dann nicht privilegierte Container darin zu erstellen.
quelle
--privileged=true
--privileged
ist ein SicherheitsrisikoIn der Regel treten Berechtigungsprobleme bei der Bereitstellung eines Host-Volumes auf, weil die UID / GID im Container gemäß den UID / GID-Berechtigungen der Datei auf dem Host keinen Zugriff auf die Datei hat. Dieser spezielle Fall ist jedoch anders.
Der Punkt am Ende der Berechtigungszeichenfolge zeigt an
drwxr-xr-x.
, dass SELinux konfiguriert ist. Wenn Sie einen Host-Mount mit SELinux verwenden, müssen Sie eine zusätzliche Option an das Ende der Volume-Definition übergeben:Ihr Volume Mount-Befehl würde dann folgendermaßen aussehen:
Weitere Informationen zu Host-Mounts mit SELinux finden Sie unter: https://docs.docker.com/storage/#configure-the-selinux-label
Für andere Benutzer, bei denen dieses Problem bei Containern auftritt, die als ein anderer Benutzer ausgeführt werden, müssen Sie sicherstellen, dass die UID / GID des Benutzers im Container über Berechtigungen für die Datei auf dem Host verfügt. Auf Produktionsservern erfolgt dies häufig, indem die UID / GID im Image-Erstellungsprozess so gesteuert wird, dass sie mit einer UID / GID auf dem Host übereinstimmt, der Zugriff auf die Dateien hat (oder, noch besser, keine Host-Mounts in der Produktion verwenden).
Ein benanntes Volume wird häufig Host-Mounts vorgezogen, da es das Volume-Verzeichnis aus dem Image-Verzeichnis initialisiert, einschließlich etwaiger Dateieigentümer und Berechtigungen. Dies geschieht, wenn das Volume leer ist und der Container mit dem benannten Volume erstellt wird.
MacOS-Benutzer haben jetzt OSXFS, das UID / GIDs automatisch zwischen dem Mac-Host und den Containern verarbeitet. Ein Ort, an dem es nicht hilft, sind Dateien aus der eingebetteten VM, die in den Container eingebunden werden, wie /var/lib/docker.sock.
Für Entwicklungsumgebungen, in denen sich die Host-UID / GID pro Entwickler ändern kann, besteht meine bevorzugte Lösung darin, den Container mit einem als Root ausgeführten Einstiegspunkt zu starten, die UID / GID des Benutzers im Container so zu korrigieren, dass sie mit der UID / GID des Host-Volumes übereinstimmt, und Verwenden Sie
gosu
diese Option, um vom Root zum Containerbenutzer zu wechseln und die Anwendung im Container auszuführen. Das wichtige Skript dafür befindet sichfix-perms
in meinen Basis-Image-Skripten, die unter https://github.com/sudo-bmitch/docker-base zu finden sindDas wichtige Bit aus dem
fix-perms
Skript ist:Dadurch werden die UID des Benutzers im Container und die UID der Datei
usermod
abgerufen. Wenn sie nicht übereinstimmen, wird die UID aufgerufen. Zuletzt wird eine rekursive Suche durchgeführt, um alle Dateien zu reparieren, die die UIDs nicht geändert haben. Ich mag dies besser als das Ausführen eines Containers mit einem-u $(id -u):$(id -g)
Flag, da für den obigen Einstiegspunktcode nicht jeder Entwickler ein Skript ausführen muss, um den Container zu starten, und für alle Dateien außerhalb des Volumes, deren Eigentümer der Benutzer ist, werden die Berechtigungen korrigiert.Sie können Docker auch ein Hostverzeichnis aus einem Image initialisieren lassen, indem Sie ein benanntes Volume verwenden, das einen Bind-Mount ausführt. Dieses Verzeichnis muss im Voraus vorhanden sein, und Sie müssen einen absoluten Pfad zum Host-Verzeichnis angeben, im Gegensatz zu Host-Volumes in einer Compose-Datei, bei denen es sich um relative Pfade handeln kann. Das Verzeichnis muss auch leer sein, damit Docker es initialisieren kann. Drei verschiedene Optionen zum Definieren eines benannten Volumes für einen Bind-Mount sehen folgendermaßen aus:
Wenn Sie versuchen, Benutzernamensräume zu verwenden, werden Sie feststellen, dass Host-Volumes Berechtigungsprobleme haben, da die UIDs / GIDs der Container verschoben werden. In diesem Szenario ist es wahrscheinlich am einfachsten, Host-Volumes zu vermeiden und nur benannte Volumes zu verwenden.
quelle
Von access.redhat.com:Sharing_Data_Across_Containers :
Es scheint nur eine Problemumgehung zu sein, aber ich habe es versucht und es funktioniert.
quelle
Ich habe überprüft, dass
chcon -Rt svirt_sandbox_file_t /path/to/volume
dies funktioniert und Sie nicht als privilegierter Container ausgeführt werden müssen.Dies ist auf:
quelle
Versuchen Sie es
docker volume create
.Schauen Sie sich das Dokument https://docs.docker.com/engine/reference/commandline/volume_create/ an.
quelle
Ich hatte ein ähnliches Problem, mein Problem wurde durch eine Nichtübereinstimmung zwischen der UID des Hosts und der UID des Containernutzers verursacht. Das Update bestand darin, die UID des Benutzers als Argument an den Docker-Build zu übergeben und den Benutzer des Containers mit derselben UID zu erstellen.
In der DockerFile:
Im Build-Schritt:
Danach gab mir das Ausführen des Containers und der Befehle gemäß OP das erwartete Ergebnis.
quelle
Ich habe dieses Problem mithilfe eines Datencontainers behoben. Dies hat auch den Vorteil, dass die Daten von der Anwendungsschicht isoliert werden. Sie könnten es so laufen lassen:
Dieses Tutorial bietet eine gute Erklärung zur Verwendung von Datencontainern.
quelle
In meiner Situation war das Problem anders. Ich weiß nicht warum, aber selbst wenn das Verzeichnis auf dem Host darauf
chmod 777
ausgeführt wurde, war es im Docker als sichtbar755
.Das Laufen im Container hat das
sudo chmod 777 my_volume_dir
Problem behoben.quelle
chmod 777
repariert kaum etwas.sudo -s
habe den Trick für mich auf MAC gemachtquelle