Lösung für den Docker-Container, der keine Schreibberechtigung für das Host-Verzeichnis hat

Lösung für den Docker-Container, der keine Schreibberechtigung für das Host-Verzeichnis hat

Beim Anwenden von Docker-Containern mounten wir häufig das Host-Verzeichnis in den Docker-Container.

Wenn die Ordnerberechtigungen des Hostcomputers dem Stammbenutzer gehören, müssen wir den Benutzer mit den Ordnerberechtigungen auf „chown“ setzen, um das normale Schreiben des Verzeichnisinhalts sicherzustellen.

Hier ist ein Beispiel:

Es wird die Docker-Version von Jenkins verwendet. Nach dem Ausführen tritt der folgende Fehler auf:

[root@localhost CICD]# Docker-Protokolle -f Jenkins 
touch: „/var/jenkins_home/copy_reference_file.log“ kann nicht berührt werden: Berechtigung verweigert
Kann nicht in /var/jenkins_home/copy_reference_file.log schreiben. Falsche Volumeberechtigungen?

Das Verzeichnis, in dem mein Jenkins gemountet ist, ist /opt/jenkins/xxxxx, erstellt vom Root-Benutzer, und die UID des Jenkins-Benutzers ist 1000

Sie müssen die Einstellungen also wie folgt ändern:

sudo chown -R 1000:1000 /opt/jenkins

Starten Sie dann den Container neu und der Fehler wird behoben.

Ergänzung: Einführung von zwei Möglichkeiten zum Umgang mit Dateiberechtigungen beim Schreiben von Volumes aus Docker-Containern

Sag es im Voraus

Container werden häufig als Ersatz für native Installationstools verwendet. Es ist viel besser, Container mit den erforderlichen Versionen auf dem Host zu verwenden, als veraltete Tools zu nutzen. Bei jeder Interaktion des Containers mit dem Hostsystem bleiben jedoch Dateien mit falschen oder beschädigten Berechtigungen zurück.

Glücklicherweise erfordert die Lösung dieses Problems nicht den Einsatz von Skripten.

Problembeschreibung

Wenn ein Container ein lokales Verzeichnis bereitstellt und Dateien dorthin schreibt, wird dessen Eigentümerschaft durch den Benutzer innerhalb des Containers bestimmt:

nicholas@host:~/source$ mkdir Quelle
nicholas@host:~/source$ docker run -it --rm --volume $(pwd):/source --workdir /source ubuntu
root@a031d11c9515:/source# mkdir Unterverzeichnis
root@a031d11c9515:/source# touch-Unterverzeichnis/neue Datei
root@a031d11c9515:/Quelle# beenden
Ausfahrt
nicholas@host:~/source$ ls -lR
.:
insgesamt 4
drwxr-xr-x 2 root root 4096 Jul 16 19:35 Unterverzeichnis
 
./Unterverzeichnis:
gesamt 0
-rw-r--r-- 1 root root 0 Jul 16 19:35 newfile
nicholas@host:~/source$ rm -rf Unterverzeichnis/
rm: „subdir/newfile“ kann nicht entfernt werden: Berechtigung verweigert

Darüber hinaus können Sie diese Verzeichnisse und Dateien mit falschen Eigentümern möglicherweise nicht löschen.

Lösung 1: Aus dem Behälter nehmen

Eine sehr gängige Lösung besteht darin, den Besitz von Dateien und Verzeichnissen innerhalb des Containers zu ändern:

nicholas@host:~/Quelle$ docker run -it --rm --volume $(pwd):/Quelle --workdir /Quelle ubuntu
root@d1c3bee8bb2b:/Quelle# ls -al
insgesamt 12
drwxrwxr-x 3 1000 1004 4096 16. Juli 19:35 .
drwxr-xr-x 1 root root 4096 16. Juli 19:39 ..
drwxr-xr-x 2 root root 4096 Jul 16 19:35 Unterverzeichnis
root@d1c3bee8bb2b:/Quelle# chown 1000:1000 Unterverzeichnis/ -R
root@d1c3bee8bb2b:/Quelle# ls -l
insgesamt 4
drwxr-xr-x 2 1000 1000 4096 Jul 16 19:35 Unterverzeichnis
root@d1c3bee8bb2b:/Quelle# beenden
Ausfahrt
nicholas@host:~/source$ ls -l
insgesamt 4
drwxr-xr-x 2 Nicholas lpadmin 4096 16. Juli 19:35 Unterverzeichnis
nicholas@host:~/quelle$

Der Nachteil dieses Ansatzes besteht darin, dass zusätzliche Logik erforderlich ist und Sie die Benutzer- und Gruppen-IDs des Benutzers kennen müssen, der den Container ausführt.

Lösung 2: Erstellen Sie eine Datei mit dem richtigen Eigentümer

Die zweite Lösung ist sauberer und erstellt die Dateien und Verzeichnisse mit den richtigen Eigentümern innerhalb des Containers. Docker bietet einen Parameter zum Festlegen der Benutzer-ID und Gruppen-ID des Benutzers im Container:

nicholas@host:~/source$ docker run -it --rm --volume $(pwd):/source --workdir /source --user $(id -u):$(id -g) ubuntu
Gruppen: Name für Gruppen-ID 1004 kann nicht gefunden werden
Ich habe keinen Namen!@bf7f355f3b65:/source$ touch newfile
Ich habe keinen Namen!@bf7f355f3b65:/source$ exit
Ausfahrt
nicholas@host:~/source$ ls -l
insgesamt 4
-rw-r--r-- 1 nicholas nicholas 0 Jul 16 19:42 newfile
drwxr-xr-x 2 Nicholas lpadmin 4096 16. Juli 19:35 Unterverzeichnis
nicholas@host:~/quelle$

Mit dieser Methode können Sie Benutzer-ID- und Gruppen-ID-Fehler beheben.

Bitte beachten Sie, dass die Ausführung als Root innerhalb eines Containers aus Sicherheitsgründen die schlechteste Vorgehensweise ist. Dockerfiles sollten immer die USER-Direktive verwenden, um die direkte Verwendung von Root-Rechten zu vermeiden.

Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Sollten dennoch Fehler oder unvollständige Überlegungen vorliegen, freue ich mich über eine Korrektur.

Das könnte Sie auch interessieren:
  • Docker ermöglicht den nahtlosen Aufruf von Shell-Befehlen zwischen Container und Host
  • Lösung, wenn der Docker-Container nicht auf den Host-Port zugreifen kann
  • Führen Sie die Shell oder das Programm im Docker-Container auf dem Host aus.
  • Aufrufen und Ausführen von Host-Docker-Operationen im Docker-Container
  • Detaillierte Erläuterung zur Lösung des Problems, dass der Docker-Container nicht über IP auf den Hostcomputer zugreifen kann
  • So verwenden Sie einen Docker-Container für den Zugriff auf das Host-Netzwerk
  • Lösen Sie das Problem des 8-Stunden-Unterschieds zwischen Docker-Container und Host-Computer

<<:  Detaillierte Erläuterung des Ausführungsprozesses von MySQL-Abfrageanweisungen

>>:  JavaScript-Interview: So implementieren Sie die Methode zur Array-Abflachung

Artikel empfehlen

Beispielcode zur Trennung von Front-End und Back-End mit FastApi+Vue+LayUI

Inhaltsverzeichnis Vorwort Projektdesign hinteres...

Reines CSS-Dropdown-Menü

Ergebnisse erzielen Implementierungscode html <...

Lösen Sie das Problem der leeren Lücke am unteren Rand des Img-Bildes

Bei der Arbeit an einem aktuellen Projekt habe ic...

So zeigen Sie im Hintergrund laufende Programme in Linux an und schließen sie

1. Führen Sie die .sh-Datei aus Sie können es dir...

Zusammenfassung einiger kleinerer Probleme mit der MySQL-Autoinkrement-ID

Die folgenden Fragen basieren alle auf der InnoDB...

Häufig verwendete höherwertige Funktionen und umfassende Beispiele in Vue

1. Häufig verwendete höherwertige Funktionen von ...

Beispielcode zur Implementierung des Dunkelmodus mit CSS-Variablen

Vor kurzem wurde WeChat von Apple gezwungen, eine...

JS-Implementierung des Karussell-Karussell-Falls

In diesem Artikelbeispiel wird der spezifische JS...