Unter OS X.
Ich versuche, mysql in einem Docker-Container über boot2docker auszuführen, indem ich das Volume /var/lib/mysql
auf dem Host installiere, so dass ich persistente mysql-Daten haben kann.
Ich plane, in Zukunft einen Container nur für Daten zu verwenden, aber im Moment habe ich versucht, dies mit dieser Option zu tun.
Ich verwende den folgenden Befehl, um den Container auszuführen:
docker run -v /Users/yash/summers/db:/var/lib/mysql -i -t 'image name'
Der Ordner /Users/yash/summers/db
ist bereits vorhanden.
Ich stehe in dieser Hinsicht vor den Problemen der Geheimhaltung. Mit Kommandozeile kann ich auf das Verzeichnis zugreifen, neue Dateien erstellen / entfernen, aber wenn ich laufe
service mysql start
, ich bekomme den folgenden Fehler:
Ich habe versucht, dies in den letzten zwei Tagen zu lösen, indem ich so viele Seiten wie dieses ,
Ich kann mein Problem nicht lösen. Ich denke, dass ich nicht in der Lage bin, das zu tun, was die Lösungen vorschlagen.
Nach meinem Verständnis gibt es auf diesen Seiten einige Problemumgehungen, die das Ändern der Uids und Guids beinhalten, aber ich denke, sie sind nicht gut erklärt.
Kann mir bitte jemand eine ausführliche Problemumgehung dafür erklären.
Update 1: Ich habe es versucht, indem ich auch einen reinen Datencontainer verwendet habe und immer noch das gleiche Problem habe.
Ich kann alles gut ausführen, wenn ich keine Option -v
oder --volumes-from
verwende, also denke ich, dass es in mysql server kein Problem gibt.
Update 2: Dockerfile, das zum Erstellen des Nur-Daten-Containers verwendet wird:
%Vor%Es gibt zwei verschiedene Lösungen.
Lösung # 1. Mit Dockerfile
(Ich mag es nicht, weil ich das offizielle Bild von Docker Hub ohne Änderungen bevorzuge)
Fügen Sie RUN usermod -u 1000 mysql
zu Ihrer Docker-Datei hinzu, um ID 1000 festzulegen
für Benutzer "mysql" (die gleiche ID wie in Docker-Maschine).
Lösung # 2. Mit my.cnf .
Immer noch benutze ich meine eigene Konfiguration Ich bevorzuge diese Lösung. Wir haben bereits Root-Benutzer mit ID 1000, deswegen kann MySQL mit diesem Benutzer ausführen:
meine.cnf
Hauptreihe ist user = root
(Sie können sed
verwenden, um nur diese Zeile in der Datei zu ändern. Ich bevorzuge mount all file)
Ändern Sie den Standardwert my.cnf mit dieser Datei:
docker run -it -v ./mysql/var/lib/mysql:/var/lib/mysql -v ./my.cnf::/etc/mysql/my.cnf mariab: 10.0.22
Wenn Sie die Option docker run -v
verwenden, kann docker nicht mit dem Besitz von Dateien manipuliert werden. Der Eigentümer des eingehängten Ordners innerhalb des Containers hat also dieselbe UID wie im Host-System (Benutzername kann unterschiedlich sein).
Sie können den Besitz der Datei oder des Verzeichnisses innerhalb des Containers durch den Befehl chmod
ändern, aber auch den Besitz im Host-System ändern.
So können Sie die korrekte Eigentümerschaft auf Ihrem Host-System vorbereiten, bevor Sie den Andock-Container ausführen.
Dieses Beispiel zeigt, wie es funktioniert (versuchen Sie es auf Ihrem System):
Ich habe ~ / foo Verzeichnis, das mir gehört - meine UID ist 1000
%Vor%Führen Sie den Andock-Container aus, mounten Sie das Verzeichnis ~ / foo und zeigen Sie das Eigentum im Container an
%Vor%Die Eigentümer-UID im Container ist identisch. Jetzt ändere ich den Verzeichnisbesitz auf meinem Computer.
%Vor%Starten Sie den Container erneut, mounten Sie das foo-Verzeichnis und zeigen Sie den Besitz an
%Vor%Eigentümer-UID wurde ebenfalls geändert
Aber es gibt eine Ausnahme. Wenn Sie versuchen, ein Volume in ein nicht vorhandenes Verzeichnis einzuhängen, erstellt docker automatisch dieses fehlende Verzeichnis (dies ist jedoch veraltetes Feature, also tun Sie dies nicht), und dieses Verzeichnis wird mit der UID 0 erstellt. Probieren Sie es aus:
%Vor%Ich bin in ähnlicher Weise auf dieses Problem gestoßen; Ich löste es durch chmod / chown'ing in meinem Datencontainer, z. B .:
%Vor%Ich glaube, das funktioniert, weil UFS nun die Berechtigungen korrekt aufzeichnet und sich nicht auf einen direkten Host-Mount-Vorgang verlässt, der, wie Sie festgestellt haben, unter OS X nicht funktioniert.
Tags und Links docker boot2docker