Ich versuche, einen Container mit einer MySQL-Datenbank zu erstellen und dieser Datenbank ein Schema hinzuzufügen.
Meine aktuelle Docker-Datei lautet:
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
COPY files/epcis_schema.sql /data/epcis_schema.sql
# Change the working directory
WORKDIR data
CMD mysql -u $MYSQL_USER -p $MYSQL_PASSWORD $MYSQL_DATABASE < epcis_schema.sql
Um den Container zu erstellen, folge ich der Dokumentation in Docker und führe diesen Befehl aus:
docker run --name ${CONTAINER_NAME} -e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} -e MYSQL_USER=${DB_USER} -e MYSQL_PASSWORD=${DB_USER_PASSWORD} -e MYSQL_DATABASE=${DB_NAME} -d mvpgomes/epcisdb
Aber wenn ich diesen Befehl ausführe, wird der Container nicht erstellt und im Container-Status kann man sehen, dass die CMD nicht erfolgreich ausgeführt wurde, sondern nur der mysql
Befehl ausgeführt wird.
Gibt es eine Möglichkeit, die Datenbank mit dem Schema zu initialisieren, oder muss ich diese Vorgänge manuell ausführen?
mysql
docker
database-schema
Marcus Gomes
quelle
quelle
Antworten:
Es tut mir leid für diese super lange Antwort, aber Sie haben noch einen kleinen Weg vor sich, um dorthin zu gelangen, wo Sie wollen. Ich werde sagen, dass Sie normalerweise den Speicher für die Datenbank nicht im selben Container wie die Datenbank selbst ablegen würden, sondern entweder ein Host-Volume bereitstellen würden, damit die Daten auf dem Docker-Host erhalten bleiben, oder dass möglicherweise ein Container verwendet werden könnte Halten Sie die Daten (/ var / lib / mysql). Außerdem bin ich neu in MySQL, daher ist dies möglicherweise nicht sehr effizient. Das gesagt...
Ich denke, hier kann es einige Probleme geben. Die Docker-Datei wird verwendet, um ein Bild zu erstellen. Sie müssen den Erstellungsschritt ausführen. In dem Verzeichnis, das die Docker-Datei enthält, würden Sie mindestens Folgendes tun:
Die Docker-Datei beschreibt das zu erstellende Bild. Ich weiß nicht viel über MySQL (ich bin ein Postgres-Fan), aber ich habe in den Interwebs nach "Wie initialisiere ich einen MySQL-Docker-Container?" Gesucht. Zuerst habe ich ein neues Verzeichnis erstellt, in dem ich arbeiten kann, ich habe es mdir genannt, dann habe ich ein Dateiverzeichnis erstellt, in dem ich eine epcis_schema.sql-Datei abgelegt habe, die eine Datenbank und eine einzelne Tabelle erstellt:
Dann habe ich ein Skript namens init_db im Dateiverzeichnis erstellt:
(Der größte Teil dieses Skripts wurde von hier entfernt: https://gist.github.com/pda/9697520 )
Hier ist das Skript files / run_db, das ich erstellt habe:
Schließlich die Docker-Datei, um sie alle zu binden:
Also habe ich in mein mdir-Verzeichnis (das die Docker-Datei zusammen mit dem Dateiverzeichnis enthält) cd'ed. Ich führe dann den Befehl aus:
Sie sollten die Ausgabe wie folgt sehen:
Sie haben jetzt ein Bild '7f6d5215fe8d'. Ich könnte dieses Bild ausführen:
und das Bild startet, ich sehe eine Instanzzeichenfolge:
Ich könnte es dann "stoppen" und neu starten.
Wenn Sie sich die Protokolle ansehen, enthält die erste Zeile:
Dann am Ende der Protokolle:
Dies sind die Nachrichten aus dem Skript / tmp / run_db. Die erste zeigt an, dass die Datenbank aus der gespeicherten (anfänglichen) Version entpackt wurde, die zweite zeigt an, dass die Datenbank bereits vorhanden war, sodass die vorhandene Kopie verwendet wurde.
Hier ist ein ls -lR der oben beschriebenen Verzeichnisstruktur. Beachten Sie, dass init_db und run_db Skripte mit gesetztem Ausführungsbit sind:
quelle
init_db
Skript.RUN
Befehl erteile, und das Problem ist anscheinend gelöst. Aber dann, wenn ich ausführe, habedocker run
ich das gleiche Problem mit demrun_db
Skript.Ich hatte das gleiche Problem, bei dem ich das Schema meiner MySQL Docker-Instanz initialisieren wollte, aber ich hatte Schwierigkeiten, dies zum Laufen zu bringen, nachdem ich ein bisschen gegoogelt und den Beispielen anderer gefolgt war. So habe ich es gelöst.
1) Speichern Sie Ihr MySQL-Schema in einer Datei.
2) Verwenden Sie den Befehl ADD, um Ihre Schemadatei zum
/docker-entrypoint-initdb.d
Verzeichnis im Docker-Container hinzuzufügen . Diedocker-entrypoint.sh
Datei führt alle Dateien in diesem Verzeichnis aus, die mit".sql"
der MySQL-Datenbank enden .Dockerfile:
3) Starten Sie die Docker MySQL-Instanz.
Dank des Einrichtens von MySQL und des Importierens eines Dumps in Dockerfile, um mich auf die Datei docker-entrypoint.sh aufmerksam zu machen, und der Tatsache, dass sowohl SQL- als auch Shell-Skripte ausgeführt werden!
quelle
schema.sql
? Ich möchte, dass meine Datenbank entsprechend aktualisiert wird. Was passiert auch, wenn ich diesen Container zum zweiten Mal baue? Wird db zerstört und neu erstellt?Ein anderer Weg, der auf einer Zusammenführung mehrerer Antworten basiert:
Docker-Compose-Datei:
Dabei ist
/home/user
.. ein freigegebener Ordner auf dem HostUnd im
/home/user/db/mysql/init
Ordner ... legen Sie einfach eine SQL-Datei mit einem beliebigen Namen ab, die beispielsweise Folgendesinit.sql
enthält:Laut der offiziellen MySQL-Dokumentation können Sie mehr als eine SQL-Datei in die
docker-entrypoint-initdb.d
, sie werden in alphabetischer Reihenfolge ausgeführtquelle
Verwenden Sie Docker-Compose auf andere einfache Weise mit den folgenden Zeilen:
Fügen Sie Ihr Datenbankschema in die Datei ./database/install_db.sql ein. Jedes Mal, wenn Sie Ihren Container aufbauen, wird die Datei install_db.sql ausgeführt.
quelle
Ich habe Gregs Antwort mit null Erfolg versucht. Ich muss etwas falsch gemacht haben, da meine Datenbank nach allen Schritten keine Daten enthielt: Ich habe das neueste Bild von MariaDB verwendet, nur für den Fall.
Dann habe ich beschlossen, den Einstiegspunkt für das offizielle MariaDB-Image zu lesen und daraus eine einfache Docker-Compose- Datei zu generieren :
Jetzt kann ich meine Daten beibehalten UND eine Datenbank mit meinem eigenen Schema erstellen!
quelle
Wenn Sie nach dem 4. August 2015 das offizielle MySQL-Docker-Image verwenden, können Sie einfach eine Datei in das Verzeichnis /docker-entrypoint-initdb.d/ HINZUFÜGEN / kopieren und sie wird ausgeführt, wenn der Container initialisiert wird. Siehe github: https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225, wenn Sie es auf anderen Container-Images implementieren möchten
quelle
Die einfachste Lösung ist die Verwendung von tutum / mysql
Schritt 1
Schritt 2
Schritt 3
Gehen Sie zu CONTAINER_ID und führen Sie den Befehl aus
docker logs
, um die generierten Kennwortinformationen anzuzeigen .quelle
tutum/mysql:5.5
und es war erfolgreich.docker run -d -p 3306:3306 -v /tmp:/tmp -e MYSQL_PASS="admin" -e STARTUP_SQL="/tmp/mysqldump.mysql" tutum/mysql:5.5
. Sie können jederzeit einen Befehl ausführendocker logs CONTAINER_ID
, um die Fehlermeldungen anzuzeigen, wenn Probleme aufgetreten sind./tmp/to_be_imported.mysql
kommt. Ist das ein Pfad auf dem Host-Betriebssystem? Wo ist einCOPY
oderADD
, um Dinge in das Dateisystem des Containers zu stellen?COPY
/ nicht,ADD
weil das Host-Verzeichnis / tmp in / tmp des Containers eingehängt ist. Schauen Sie sich den Befehl genau an, da ist das Teil-v /tmp:/tmp
. Persönlich würde ich ein Volume nicht einfach bereitstellen, um die Datei für den Container verfügbar zu machen, aber ich denke, es ist eine persönliche Entscheidung.Für diejenigen, die kein Einstiegspunktskript wie mich erstellen möchten, können Sie mysqld tatsächlich zur Erstellungszeit starten und dann die mysql-Befehle in Ihrer Docker-Datei wie folgt ausführen:
Der Schlüssel hier ist, mysqld_safe mit dem Einzelzeichen in den Hintergrund zu senden
&
.quelle
Unten finden Sie die Docker-Datei, mit der ich xampp erfolgreich installiert, eine MariaDB mit Schema erstellt und mit den auf dem lokalen Server verwendeten Informationen (Benutzer, Bildbestellungen usw.) vorab ausgefüllt habe.
quelle
Nachdem Sie sich ein wenig damit abgefunden haben, schauen Sie sich die Docker-Datei mit benannten Volumes (DB-Daten) an. Es ist wichtig, im letzten Teil, in dem ich erwähnt habe, dass es sich um eine Lautstärke handelt, ein Plus zu erklären
[external]
Alle haben auf diese Weise großartig funktioniert!
quelle