Verwaltung von Berechtigungen für Volume-Mounts
Docker-Volumes ermöglichen es Ihnen, Daten zwischen dem Host und Containern zu teilen. Die korrekte Verwaltung von Berechtigungen bei der Verwendung von Volumes ist jedoch wichtig, um Probleme zu vermeiden. In diesem Schritt werden wir lernen, wie man Berechtigungen bei der Verwendung von Volume-Mounts behandelt.
Verständnis von Problemen mit Volume-Mount-Berechtigungen
Die Hauptherausforderung bei Docker-Volume-Mounts besteht darin, dass die Benutzer-IDs (UIDs) innerhalb des Containers möglicherweise nicht mit den Benutzer-IDs auf dem Host-System übereinstimmen. Dies kann zu Berechtigungsproblemen führen, wenn auf Dateien in gemounteten Volumes zugegriffen wird.
Lassen Sie uns dieses Problem anhand eines einfachen Beispiels demonstrieren.
Zunächst erstellen Sie ein neues Verzeichnis auf dem Host, das wir in einen Container mounten werden:
mkdir -p ~/project/host-data
cd ~/project/host-data
Erstellen Sie eine Testdatei in diesem Verzeichnis:
echo "This is a test file created on the host" > host-file.txt
Prüfen Sie die Eigentümerschaft dieser Datei:
ls -l host-file.txt
Sie sollten sehen, dass die Datei vom Benutzer labex
(Ihr aktueller Benutzer auf dem Host) besessen wird:
-rw-r--r-- 1 labex labex 39 May 15 13:00 host-file.txt
Jetzt starten wir einen Container, der dieses Verzeichnis mountet, und versuchen, die Datei zu ändern:
docker run -it --rm -v ~/project/host-data:/container-data ubuntu:22.04 bash
Sie befinden sich jetzt innerhalb des Containers. Prüfen wir die Eigentümerschaft der gemounteten Datei:
ls -l /container-data/host-file.txt
Sie können eine Ausgabe ähnlich der folgenden sehen:
-rw-r--r-- 1 1000 1000 39 May 15 13:00 /container-data/host-file.txt
Beachten Sie, dass die Datei numerische IDs anstelle von Benutzernamen anzeigt, da der Container den Benutzer labex
vom Host nicht kennt.
Versuchen Sie, eine neue Datei im gemounteten Verzeichnis zu erstellen:
echo "This is a test file created in the container" > /container-data/container-file.txt
Jetzt prüfen wir die Eigentümerschaft dieser neuen Datei:
ls -l /container-data/container-file.txt
Sie sollten sehen:
-rw-r--r-- 1 root root 47 May 15 13:05 /container-data/container-file.txt
Die Datei wird vom Benutzer root
innerhalb des Containers besessen (da wir standardmäßig als root
laufen).
Verlassen Sie den Container:
exit
Jetzt prüfen Sie die Eigentümerschaft beider Dateien auf dem Host:
ls -l ~/project/host-data/
Sie werden sehen, dass die aus dem Container erstellte Datei auf dem Host von root
besessen wird:
-rw-r--r-- 1 root root 47 May 15 13:05 container-file.txt
-rw-r--r-- 1 labex labex 39 May 15 13:00 host-file.txt
Dies kann zu Berechtigungsproblemen führen, wenn ein Nicht-Root-Benutzer auf dem Host auf diese Dateien zugreifen oder sie ändern muss.
Lösung von Problemen mit Volume-Berechtigungen
Es gibt mehrere Möglichkeiten, Probleme mit Volume-Berechtigungen zu lösen. Lassen Sie uns einige gängige Ansätze untersuchen.
Ansatz 1: Benutzer in Dockerfile so festlegen, dass er mit dem Host-Benutzer übereinstimmt
Erstellen Sie ein neues Verzeichnis für dieses Beispiel:
mkdir -p ~/project/volume-permissions
cd ~/project/volume-permissions
Erstellen Sie eine neue Dockerfile:
nano Dockerfile
Fügen Sie den folgenden Inhalt hinzu:
FROM ubuntu:22.04
## Create a user with the same UID as the host user
RUN useradd -m -u 1000 appuser
## Create app directory and set ownership
RUN mkdir -p /app/data && chown -R appuser:appuser /app
## Set working directory
WORKDIR /app
## Switch to appuser
USER appuser
## Command to run
CMD ["bash", "-c", "echo 'I can write to the mounted volume' > /app/data/test.txt && tail -f /dev/null"]
Speichern Sie die Datei und verlassen Sie den Editor.
Bauen Sie das Image:
docker build -t volume-permissions-image .
Erstellen Sie ein Host-Verzeichnis für Tests:
mkdir -p ~/project/volume-permissions/host-data
Starten Sie einen Container mit dem gemounteten Volume:
docker run -d --name volume-test -v ~/project/volume-permissions/host-data:/app/data volume-permissions-image
Nach einer Weile prüfen Sie die Eigentümerschaft der erstellten Datei auf dem Host:
ls -l ~/project/volume-permissions/host-data/
Sie sollten sehen, dass die Datei von einem Benutzer mit der UID 1000 besessen wird, was mit der UID Ihres Host-Benutzers übereinstimmen sollte:
-rw-r--r-- 1 labex labex 35 May 15 13:15 test.txt
Dieser Ansatz funktioniert, weil wir einen Benutzer im Container mit der gleichen UID wie der Host-Benutzer erstellt haben.
Ansatz 2: Verwendung der --user
-Option
Ein anderer Ansatz besteht darin, die --user
-Option zu verwenden, um anzugeben, welche Benutzer-ID beim Starten des Containers verwendet werden soll.
Zunächst bereinigen Sie den vorherigen Container:
docker stop volume-test
docker rm volume-test
Jetzt starten Sie einen Container mit der --user
-Option:
docker run -d --name user-flag-test --user "$(id -u):$(id -g)" -v ~/project/volume-permissions/host-data:/data ubuntu:22.04 bash -c "echo 'Created with --user flag' > /data/user-flag-test.txt && sleep 3600"
Dieser Befehl startet den Container mit Ihrer aktuellen Benutzer-ID und Gruppen-ID.
Prüfen Sie die Eigentümerschaft der neuen Datei:
ls -l ~/project/volume-permissions/host-data/user-flag-test.txt
Sie sollten sehen, dass die Datei von Ihrem Host-Benutzer besessen wird:
-rw-r--r-- 1 labex labex 23 May 15 13:20 user-flag-test.txt
Lassen Sie uns vor dem nächsten Schritt aufräumen:
docker stop user-flag-test
docker rm user-flag-test
Diese Ansätze zeigen, wie man Berechtigungen bei der Verwendung von Docker-Volumes verwaltet. Indem Sie die Benutzer-IDs zwischen Container und Host übereinstimmen lassen, können Sie Berechtigungsprobleme beim Teilen von Daten zwischen ihnen vermeiden.