Ich versuche, eine Docker-Datei für mein LAMP-Projekt einzurichten, habe jedoch einige Probleme beim Starten von MySQL. Ich habe die folgenden Zeilen in meiner Docker-Datei:
VOLUME ["/etc/mysql", "/var/lib/mysql"]
ADD dump.sql /tmp/dump.sql
RUN /usr/bin/mysqld_safe & sleep 5s
RUN mysql -u root -e "CREATE DATABASE mydb"
RUN mysql -u root mydb < /tmp/dump.sql
Aber ich bekomme immer wieder diesen Fehler:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
Irgendwelche Ideen zum Einrichten der Datenbankerstellung und des Dump-Imports während eines Dockerfile-Builds?
RUN
Befehl in einem anderen Container ausgeführt wird. Es ist hier gut erklärt: stackoverflow.com/questions/17891669/…RUN
Zeile ausgeführt wird.RUN
mit mehreren Schritten. Ein Beispiel für eine mehrstufige Installation einer Software finden Sie hier: stackoverflow.com/questions/25899912/install-nvm-in-docker/…Antworten:
Jeder
RUN
Befehl in aDockerfile
wird in einer anderen Schicht ausgeführt (wie in der Dokumentation vonRUN
erläutert ).In Ihrem
Dockerfile
haben Sie dreiRUN
Anweisungen. Das Problem ist, dass der MySQL-Server erst im ersten gestartet wird. In den anderen Fällen wird kein MySQL ausgeführt. Aus diesem Grund wird der Verbindungsfehler mit demmysql
Client angezeigt.Um dieses Problem zu lösen, haben Sie 2 Lösungen.
Lösung 1: Verwenden Sie eine einzeilige
RUN
Lösung 2: Verwenden Sie ein Skript
Erstellen Sie ein ausführbares Skript
init_db.sh
:Fügen Sie diese Zeilen zu Ihrem hinzu
Dockerfile
:quelle
docker run
Ausführungen hinweg erhalten bleiben, müssen Sie Volumes bereitstellen. Wenn Sie nur einen Container mit Ihrem Speicherauszug haben möchten, aber keine weiteren Änderungen beibehalten möchten, können Sie dieVOLUME
Anweisung in Ihrem Speicher entfernenDockerfile
.ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
beim Versuch Lösung 1.mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
mysql_init_db
und laden Sie es in Ihre Datenbankstruktur. Dies ermöglicht die Flexibilität, die Datenbank beim Testen automatisch zurücksetzen zu lassen. Wenn Sie jedoch möchten, dass sie erhalten bleibt oder verschiedene Datensätze testet, stellen Sie einfach ein Volume unter / var / lib / mysql mithilfe von bereitdocker run -v ...
.Mit der neuesten Version des offiziellen MySQL-Docker-Images können Sie beim Start Daten importieren. Hier ist meine docker-compose.yml
Hier habe ich meine data-dump.sql, unter
docker/data
der sich relativ zu dem Ordner befindet, aus dem das Docker-Compose ausgeführt wird. Ich mounte diese SQL-Datei in dieses Verzeichnis/docker-entrypoint-initdb.d
auf dem Container.Wenn Sie interessiert sind, wie dies funktioniert, schauen Sie sich deren
docker-entrypoint.sh
in GitHub an. Sie haben diesen Block hinzugefügt, um den Import von Daten zu ermöglichenEin zusätzlicher Hinweis: Wenn die Daten auch nach dem Stoppen und Entfernen des MySQL-Containers erhalten bleiben sollen, benötigen Sie einen separaten Datencontainer, wie Sie in der Datei docker-compose.yml sehen. Der Inhalt des Datencontainers Dockerfile ist sehr einfach.
Der Datencontainer muss sich für die Persistenz nicht einmal im Startzustand befinden.
quelle
- ./docker/data:/docker-entrypoint-initdb.d
Verzeichnis.
vor dem Container wurde entfernt.Ich habe meinen SQL-Dump in einen "db-dump" -Ordner heruntergeladen und gemountet:
Wenn ich
docker-compose up
zum ersten Mal starte, wird der Speicherauszug in der Datenbank wiederhergestellt.quelle
mysql
Version scheint die gedumpte SQL-Datei nicht zu laden, und selbst bei Verwendung von 5.6 habe ich Probleme mit InnoDb-Speicher-Engines.Ich habe den Ansatz docker-entrypoint-initdb.d verwendet (Dank an @Kuhess). In meinem Fall möchte ich meine Datenbank jedoch anhand einiger Parameter erstellen, die ich in der ENV-Datei definiert habe
1) Zuerst definiere ich eine solche ENV-Datei in meinem Docker-Stammprojektverzeichnis
2) Dann definiere ich meine Datei docker-compose.yml. Also habe ich die args-Direktive verwendet, um meine Umgebungsvariablen zu definieren, und sie aus der ENV-Datei festgelegt
3) Dann definiere ich einen MySQL-Ordner, der eine Docker-Datei enthält. Das Dockerfile ist das also
4) Jetzt benutze ich mysqldump, um meine Datenbank zu sichern und die Datei data.sql in den Ordner mysql zu legen
Die Datei ist nur eine normale SQL-Dump-Datei, aber ich füge am Anfang 2 Zeilen hinzu, damit die Datei so aussieht
Was also passiert ist, dass ich den Befehl "RUN sed -i / MYSQL_DATABASE / '$ MYSQL_DATABASE' / g '/etc/mysql/data.sql" verwendet habe, um den
MYSQL_DATABASE
Platzhalter durch den Namen meiner Datenbank zu ersetzen, in der ich ihn festgelegt habe .env Datei.Jetzt können Sie Ihren Container erstellen und ausführen
quelle
.env
Datei zu verwenden. Doch nach dieser , die.env
nur Datei Feature funktioniert , wenn Sie die Verwendungdocker-compose up
Befehl und funktioniert nicht mitdocker stack deploy
. Wenn Sie die.env
Datei also in der Produktion verwenden möchten, sollten Sie die Docker-Geheimnisse überprüfen , die mit eingeführt wurdendocker 17.06
. Dann können Sie Ihre .env Datei in Verbindung mit Geheimnisse in beiden Entwicklung nutzendocker compose up
unddocker stack deploy
ProduktionsphasenRUN sed -i '1s/^/CREATE DATABASE IF NOT EXISTS
$ MYSQL_DATABASE;\nUSE
$ MYSQL_DATABASE;\n/' data.sql
anstelle des vonsed
Ihnen vorgeschlagenen Befehls zu verwenden. Auf diese Weise können Sie jede Dump-Datei verwenden, die Sie haben - es ist nützlich, wenn Sie mit großen Datenmengen arbeiten :)Hier ist eine Arbeitsversion mit
v3
demdocker-compose.yml
. Der Schlüssel ist , die Volumina Richtlinie:In dem Verzeichnis, das ich habe, habe
docker-compose.yml
ich ein Verzeichnisdata
, das.sql
Dump-Dateien enthält . Das ist schön, weil man eine haben kann.sql
Dump-Datei pro Tabelle haben können.Ich renne einfach
docker-compose up
und ich kann loslegen. Die Daten bleiben zwischen den Stopps automatisch erhalten. Wenn Sie die Daten entfernen möchten , und „saugen“ in den neuen.sql
Dateien laufendocker-compose down
danndocker-compose up
.Wenn jemand weiß, wie er den
mysql
Docker dazu/docker-entrypoint-initdb.d
bringt , Dateien erneut zu verarbeiten, ohne das Volume zu entfernen, hinterlassen Sie bitte einen Kommentar, und ich werde diese Antwort aktualisieren.quelle
docker-compose down
war sehr wichtig, da ich trotz des Neustarts von Docker-Compose keine Änderungen sah. MYSQL_DATABASE ist in diesem Fall eine erforderliche Variable