Verzeichnisberechtigungen beim Erstellen eines Containers mit Docker

Verzeichnisberechtigungen beim Erstellen eines Containers mit Docker

Als ich gestern ein Projekt schrieb, musste ich die abgeleitete Version von MySQL, Percona, verwenden, also wollte ich Docker verwenden, um es zu installieren. Infolgedessen bin ich die ganze Nacht in die Grube getreten und habe es heute Morgen endlich gelöst. Jetzt dokumentieren Sie es hier.
Der Grund für diese Falle ist, dass ich nicht sensibel auf das Verzeichnisberechtigungsproblem von Linux bin. Mein System ist Ubuntu 16.04 und alles ist normal, wenn ich Docker Pull Percona ausführe, um das Image abzurufen.


Geben Sie nach dem Pullen Docker-Images ein, um alle Images anzuzeigen. Die Anzeige ist normal:

Anschließend erstelle ich mit folgendem Befehl einen Container (keine Zeilenumbrüche bei der Ausführung verwenden):

docker erstellen --name percona -v /data/mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:lates

Dieser Befehl bedeutet, dass ich einen Container mit dem Namen „percona“ erstelle, dann mein lokales Verzeichnis „/data/mysql-data“ dem Verzeichnis „/var/lib/mysql“ im Docker-Container zuordne und Port 3306 angebe, dann das Passwort des Root-Benutzers der Datenbank auf „root“ setze und das letzte „percona:latest“ die Version angibt, die ich oben abgerufen habe.

Da die Datenbank im Docker-Container nur ein Spiegel ist, kann man davon ausgehen, dass sie nicht wirklich existiert. Der Zweck der Zuordnung zu meinem lokalen Verzeichnis besteht darin, dass die von Docker im Verzeichnis /var/lib/mysql gespeicherten Daten synchronisiert und in meinem lokalen Verzeichnis /data/mysql-data gespeichert werden können. Dies stellt sicher, dass die Daten nicht verloren gehen, und erleichtert meine lokalen Vorgänge.

Wenn Sie die Befehlsparameter nicht verstehen, können Sie die offizielle Dokumentation lesen oder nach einem Docker-Video-Tutorial suchen, das Erklärungen enthält. Dann starte ich diesen Container, docker start percona. Nach dem Start frage ich alle laufenden Container docker ps ab, und dann gibt es ein Problem:


Es ist leer, das heißt, es werden keine laufenden Container gefunden... Dann habe ich alle Container geprüft, einschließlich der laufenden und der nicht laufenden. docker ps -a zeigt Folgendes:


Es stellte sich heraus, dass der Port nicht erfolgreich gebunden war und deshalb nicht ausgeführt wurde! Bei jeder Ausführung wurde er automatisch beendet.

Zu diesem Zeitpunkt habe ich die Docker-Protokolle überprüft und den Befehl „Docker-Protokolle Container-ID“ eingegeben, der Folgendes anzeigte:


Hinweis: 71 sind hier die ersten beiden Ziffern der Container-ID dieses Containers. Docker unterstützt diese vereinfachte Schreibweise.

Der Protokollfehler besagt, dass ich keine Berechtigung zum Erstellen und Schreiben in das Verzeichnis /var/lib/mysql im Container habe.
Nun habe ich die Ursache für dieses Problem gefunden, konnte es aber nach nächtelangem Suchen nicht lösen. Ich muss sagen, dass einige verantwortungslose Posts im Internet wirklich eine Falle sind!
Heute Morgen endlich eine Lösung gefunden:
Das heißt, überprüfen Sie, ob der Besitzer meines lokalen Verzeichnisses und der Besitzer des Verzeichnisses /var/lib/mysql im Docker-Container derselbe Benutzer sind.

docker run -ti --rm --entrypoint="/bin/bash" percona -c "whoami && id"

Mit diesem Befehl können Sie den Besitzer des Containers anzeigen. Er wird wie folgt angezeigt:


Geben Sie dann ein (ohne Zeilenumbrüche):

docker run -ti --rm -v /data/mysql-data:/var/lib/mysql --entrypoint="/bin/bash" percona -c "ls -la /var/lib/mysql"

Dieser Befehl wird verwendet, um den Besitzer dieses Verzeichnisses beim Zuordnen eines lokalen Datenträgers anzuzeigen.


Das ist der Grund. Deshalb wird ein Berechtigungsfehler gemeldet, wenn der MySQL-Benutzer auf das Verzeichnis im Docker zugreift! Denn der Besitzer des lokalen Mapping-Verzeichnisses ist der Root-Benutzer und der Besitzer des Verzeichnisses /var/lib/mysql im Docker-Container ist der MySQL-Benutzer mit der UID 999!
Die Lösung besteht dann darin, dem Besitzer des aktuellen Verzeichnisses die UID 999, den MySQL-Benutzer, zuzuweisen und dann den Container neu zu starten.

Das Problem ist gelöst! Ich habe eine ganze Nacht verschwendet. Ich muss sagen, dass ich mein Wissen über die Berechtigungskontrolle unter Linux vertiefen muss!

Dies ist das Ende dieses Artikels über die Fallstricke von Verzeichnisberechtigungen, wenn Docker Container erstellt. Weitere Informationen zu Verzeichnisberechtigungen, wenn Docker Container erstellt, finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Lösung für das Problem, dass der Hostname des Hosts im Docker-Container nicht abgerufen werden kann
  • Einfache Schritte zum Erstellen eines MySQL-Containers mit Docker
  • Detaillierte Erklärung zum Erstellen eines MySQL-Containers mit Docker und zum Herstellen einer Verbindung zum Container über die Befehlszeile
  • So erstellen Sie einen MySQL-Container mit Docker
  • Detaillierter Prozess zum Ändern des Hostnamens, nachdem Docker einen Container erstellt hat

<<:  So installieren Sie eine PHP7 + Nginx-Umgebung unter CentOS6.6

>>:  Neue Funktionen in MySQL 8.0: Hash Join

Artikel empfehlen

Fehler mit ungerader Breite und Höhe in IE6

Wie in der Abbildung gezeigt: Aber bei der Anzeig...

So zeichnen Sie spezielle Grafiken in CSS

1. Dreieck Rahmeneinstellungen Code: Breite: 300p...

Der Unterschied zwischen Hash-Modus und Verlaufsmodus im Vue-Router

vue-router hat zwei Modi Hash-Modus Verlaufsmodus...

So packen Sie das Projekt per Idee in Docker

Viele Freunde wollten schon immer wissen, wie man...

Ideen und Codes zur Realisierung des Lupeneffekts in js

In diesem Artikelbeispiel wird der spezifische Co...

Detaillierte Installationshistorie von Ubuntu 20.04 LTS

In diesem Artikel wird die Erstellung einer USB-S...

Spezifischer Einsatz von Routing Guards in Vue

Inhaltsverzeichnis 1. Globale Wache 1.1 Globaler ...

Vue implementiert ein einfaches Einkaufswagenbeispiel

In diesem Artikelbeispiel wird der spezifische Co...

Nginx-Signalsteuerung

Einführung in Nginx Nginx ist ein leistungsstarke...

So visualisieren Sie skizzierte Diagramme in Vue.js mit RoughViz

einführen Ein Diagramm ist eine grafische Darstel...

Zusammenfassung der MySQL-Injection-Bypass-Filtertechniken

Schauen wir uns zunächst den GIF-Vorgang an: Fall...