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

So legen Sie einen gepunkteten Rahmen in HTML fest

Verwenden Sie CSS-Stile und HTML-Tag-Elemente Um ...

XHTML-Erste-Schritte-Tutorial: Was ist XHTML?

Was ist HTML? Um es einfach auszudrücken: HTML wi...

Vue3-Kompilierungsprozess - Quellcodeanalyse

Vorwort: Vue3 ist schon seit langem verfügbar. Vo...

Detaillierte Erklärung der Linux-CPU-Last und CPU-Auslastung

CPU-Last und CPU-Auslastung Beides kann bis zu ei...

Implementierung der Graustufenversion mit Nginx und Lua

Installieren Sie memcached yum install -y memcach...

Ein vorläufiges Verständnis der benutzerdefinierten CSS-Eigenschaften

Heute sind CSS-Präprozessoren der Standard für di...

27 Linux-Befehle zum Bearbeiten von Dokumenten, die es wert sind, gesammelt zu werden

Linux-Befehl „col“ Der Linux-Befehl col wird zum ...

Zwei Möglichkeiten, die CSS-Priorität zu verstehen

Methode 1: Werte hinzufügen Gehen wir zu MDN, um ...

Docker installiert MySQL und löst das chinesische verstümmelte Problem

Inhaltsverzeichnis 1. Ziehen Sie das MySQL-Image ...

Methode zum Erstellen eines Redis-Clusters basierend auf Docker

Laden Sie das Redis-Image herunter Docker-Pull yy...

MySQL-Cursor-Prinzip und Analyse von Anwendungsbeispielen

Dieser Artikel erläutert anhand von Beispielen di...

Eine kurze Diskussion über die Anpassung mobiler Endgeräte

Vorwort Beim Schreiben von Front-End-Code kommt m...

JavaScript realisiert den Drag-Effekt der Modalbox

Hier ist ein Fall des Ziehens einer modalen Box. ...