Betrachten Sie die folgende triviale Docker-Datei:
FROM debian:testing
RUN adduser --disabled-password --gecos '' docker
RUN adduser --disabled-password --gecos '' bob
in einem Arbeitsverzeichnis mit nichts anderem. Erstellen Sie das Docker-Image:
docker build -t test .
Führen Sie dann ein Bash-Skript für den Container aus und verknüpfen Sie das Arbeitsverzeichnis mit einem neuen Unterverzeichnis im Basisverzeichnis von bob:
docker run --rm -it -v $(pwd):/home/bob/subdir test
Wem gehört der Inhalt des subdir
Containers? Führen Sie auf dem Container Folgendes aus:
cd /home/bob/subdir
ls -l
ad wir sehen:
-rw-rw-r-- 1 docker docker 120 Oct 22 03:47 Dockerfile
Heiliger Rauch! docker
besitzt den Inhalt! Zurück auf dem Host-Computer außerhalb des Containers sehen wir, dass unser ursprünglicher Benutzer das noch besitzt Dockerfile
. Versuchen wir, den Besitz des bob
Home-Verzeichnisses zu beheben . Führen Sie auf dem Container Folgendes aus:
chown -R bob:bob /home/bob
ls -l
und wir sehen:
-rw-rw-r-- 1 bob bob 120 Oct 22 03:47 Dockerfile
Aber warte! außerhalb des Containers rennen wir jetztls -l
-rw-rw-r-- 1 1001 1001 120 Oct 21 20:47 Dockerfile
Wir besitzen keine eigene Datei mehr. Schreckliche Nachrichten!
Wenn wir im obigen Beispiel nur einen Benutzer hinzugefügt hätten, wäre alles reibungsloser verlaufen. Aus irgendeinem Grund scheint Docker ein Home-Verzeichnis zu erstellen, das dem ersten Nicht-Root-Benutzer gehört, auf den es trifft (selbst wenn dieser Benutzer in einem früheren Image deklariert ist). Ebenso ist dieser erste Benutzer derjenige, der den gleichen Eigentumsrechten wie mein Privatbenutzer entspricht.
Frage 1 Ist das richtig? Kann mich jemand auf eine Dokumentation verweisen, ich vermute nur, basierend auf dem obigen Experiment.
Frage 2 : Vielleicht liegt dies nur daran, dass beide den gleichen numerischen Wert im Kernel haben. Wenn ich auf einem System testen würde, auf dem mein Heimbenutzer keine ID 1000
hatte, würden die Berechtigungen in jedem Fall geändert.
Frage 3 : Die eigentliche Frage lautet natürlich: Was mache ich dagegen? Wenn er auf dem angegebenen Hostcomputer bob
angemeldet ist bob
, sollte er in der Lage sein, den Container als auszuführen bob
und keine Dateiberechtigungen unter seinem Hostkonto zu ändern. Derzeit muss er den Container tatsächlich als Benutzer ausführen docker
, um zu vermeiden, dass sein Konto geändert wird.
Ich höre dich fragen, warum ich überhaupt so eine seltsame Docker-Datei habe. . Ich frage mich auch manchmal. Ich schreibe einen Container für eine Webanwendung (RStudio-Server), der es verschiedenen Benutzern ermöglicht, sich anzumelden, wobei einfach die Benutzernamen und Anmeldeinformationen des Linux-Computers als gültige Benutzernamen verwendet werden. Dies bringt mir die vielleicht ungewöhnliche Motivation, mehrere Benutzer erstellen zu wollen. Ich kann dies umgehen, indem ich den Benutzer nur zur Laufzeit erstelle und alles in Ordnung ist. Ich verwende jedoch ein Basis-Image, das einen einzelnen docker
Benutzer hinzugefügt hat, damit es interaktiv verwendet werden kann, ohne als Root ausgeführt zu werden (gemäß Best Practice). Dies ruiniert alles, da dieser Benutzer der erste wirdBenutzer und besitzt am Ende alles, so dass Versuche, sich anzumelden, wenn andere Benutzer fehlschlagen (die App kann nicht gestartet werden, da ihr Schreibberechtigungen fehlen). Das chown
erste Ausführen des Startskripts löst dieses Problem, jedoch auf Kosten verknüpfter Volumes, die Berechtigungen ändern (offensichtlich nur ein Problem, wenn Volumes verknüpft werden).