Erstellen eines MySQL-Images mit vorinstallierter Datenbank

Erstellen eines MySQL-Images mit vorinstallierter Datenbank

Mit dem Docker-Image von MySQL können Sie mysqldump-Skripte in einen bestimmten Ordner einfügen. Diese Skripte werden dann beim ersten Start zum Laden leerer Daten verwendet.

Ich habe mich gefragt, wie man ein Image erstellt, bei dem diese Ausführung bereits als Teil des Builds stattgefunden hat, sodass wir nicht auf das anfängliche Laden der Daten warten müssen.

Der Zweck des Images besteht darin, eine Entwicklerkopie einer Datenbank für lokale Tests zu haben.

Wenn möglich, hätte ich es gerne als mehrstufigen Docker-Build, sodass ich es erstellen kann, ohne MySQL auf dem Build-Server installiert zu haben.

Obwohl ich es noch nicht ausprobiert habe, ist mein allgemeiner Gedankengang folgender:

FROM mysql as builder
COPY *.sql /somefolder
COPY buildscript.sh /buildscript.sh

FROM mysql
COPY --from build /var/lib/mysql /data # to avoid using the volume folder

Und buildscript.shmacht so etwas wie

  1. Starten Sie MySQLD
  2. warten Sie, bis mysqld vollständig gestartet ist (??)
  3. Führen Sie die zum Erstellen der Daten verwendeten SQLs aus.
  4. mysqld herunterfahren
  5. synchronisieren (sicherstellen, dass alle Dateien geschrieben werden)

Antwort1

Ich denke, es ist möglich, es in Dockerfile zu machen, anstatt den Vorgang am Einstiegspunkt auszuführen. Sie sollten die Datenbankdaten in das Image kopieren und my.cnf so konfigurieren, dass es auf das Verzeichnis verweist, in dem Sie die Daten gespeichert haben, und den Dump-Vorgang am Einstiegspunkt überspringen. Wie auch immer, welche persönlichen Vorteile hat das für Sie? Ich meine, ja, Sie müssen nicht warten, um die Datenbank zur Laufzeit zu erstellen und zu füllen, aber es kostet Sie jedes Mal Zeit, wenn Sie das Image neu erstellen, und macht das Image auch größer, weil es einige Daten enthält. Sie müssen bedenken, dass sich der Zeitaufwand nicht sehr ändert, wenn Sie planen, das Image oft neu zu erstellen. Wenn Sie nicht planen, das Image häufig neu zu erstellen, könnte dies ein Vorteil sein.

Antwort2

Hier ist meine aktuelle Arbeitslösung.

Ich beginne mit demDockerfile

FROM mysql:5.7.23 as prep
COPY *.sql /docker-entrypoint-initdb.d/
COPY scripts/build-db.sh /
ARG MYSQL_ROOT_PASSWORD=my-very-secret
ARG MYSQL_USER=sampleuser
ARG MYSQL_PASSWORD=password123
RUN chmod u+x /build-db.sh
RUN /build-db.sh

FROM mysql:5.7.23
# use /data in my case so that it uses a directory that is not a VOLUME
COPY --from=prep /data /data

Dann füge ich ein hinzu, build-db.shwelches die bestehendenEinstiegspunkt.shund entfernen Sie die letzte execZeile, damit es anhält, sobald die Initialisierung abgeschlossen ist. Die Daten werden eingefügt, /datada der Standardwert /var/lib/mysqlin der nächsten Phase des Builds keine Daten enthält.

#!/bin/bash
head -n -1 /usr/local/bin/docker-entrypoint.sh > /d2.sh
chmod +x /d2.sh
exec /d2.sh --datadir=/data

Zum Starten müssen Sie --datadir=/datadas Nicht-Volumenverzeichnis verwenden.

verwandte Informationen