[Docker] Geben Sie die Anfangsdaten in docker-entrypoint-initdb.d ein, ohne das Verzeichnis [MySQL] zu mounten.

TL;DR

Text

Was ich machen wollte

Ich wollte die Initialisierung "DDL" beim Starten des Containers ausführen, ohne die "Docker-Entrypoint-Initdb.d" im Container zu überschreiben und mit der gleichen Benutzerfreundlichkeit wie beim Mounten eines Verzeichnisses.

Weise

Wie eingangs erwähnt, wird die Datei "docker-entrypoint-initdb.d" im Container nicht überschrieben, wenn die Datei bereitgestellt wird. Außerdem wird im offiziellen MySQL-Image die in. Docker-entrypoint-initdb.d platzierte .sh-Datei ausgeführt, wenn der Container gestartet wird.

Daher können Sie das Verzeichnis mit "DDL" als beliebiges Verzeichnis bereitstellen und es mit dem in "docker-entrypoint-initdb.d" bereitgestellten Shell-Skript eingeben. Das Folgende ist ein Beispiel für ein Übermittlungsskript.

Eingabeskript


#!/bin/sh
#---
#Von MySQL-Container/docker-entrypoint-initdb.Durch Mounten als Datei auf d
#Von diesem Container/tmp/init.Senden Sie die auf d gemountete differentielle DDL an MySQL
#
# /tmp/init.Ein Fehler tritt auf, wenn die Datei in d nicht vorhanden ist
#---
ls -1 /tmp/init.d/*.sql | while read file
do
  mysql -uroot -proot < $file
done

Da die Ausführungsreihe in alphabetischer Reihenfolge nach Dateinamen erfolgt, können Sie die Reihenfolge steuern, indem Sie den Dateinamen zum Zeitpunkt des Mountens anpassen. Sie können beispielsweise festlegen, dass es zuletzt ausgeführt wird, indem Sie dem Namen der zu moundernden Datei "zzz-" voranstellen.

docker-compose.yml


#Abkürzung (* Es ist ein Bild, ich habe es nicht durch Verschieben versucht)
  volumes:
    - type: bind #Hängen Sie die Eingabeshell zzz ein, damit die Ausführungsreihenfolge zuletzt ausgeführt wird-Das Präfix wird angegeben
      source: ./init.sh
      target: /docker-entrypoint-initdb.d/zzz-init.sh
    - ./init.d:/tmp/init.d/ #Richten Sie DDL am Eingabeskript aus/tmp/init.Montage auf d

Hintergrund, als dies benötigt wurde

Dies liegt daran, dass ein Bild in dem Format verwendet werden musste, das die Anfangsdaten in "docker-entrypoint-initdb.d" enthält, und das Verzeichnis hier nicht bereitgestellt werden konnte. Wenn Sie die Dateien gehorsam in "docker-entrypoint-initdb.d" anordnen, müssen Sie die "DDL" -Dateien einzeln bereitstellen. Überlegen Sie also, wie Sie sie gemeinsam in einem Verzeichnis bereitstellen und diese Methode entwickeln. Ich tat.

Inhalte, auf die ich mich beziehen durfte

Recommended Posts

[Docker] Geben Sie die Anfangsdaten in docker-entrypoint-initdb.d ein, ohne das Verzeichnis [MySQL] zu mounten.
Rails6: Geben Sie die Anfangsdaten von ActionText mit seed ein
Ändern Sie die ursprüngliche Validierungsnachricht in Japanisch ohne verstümmelte Zeichen
Eingabe in die Java-Konsole
[Docker] So sichern und wiederherstellen Sie DB-Daten der Rails-Anwendung auf Docker-Compose [MySQL]
Ich konnte die Docker + Laravel + MySQL App für Heroku bereitstellen!
[Rails] Erste Dateneingabe mit seed_fu!
Aktualisieren Sie MySQL mit Docker von 5.7 auf 8.0
Immerhin wollte ich den Inhalt von MySQL mit Docker in der Vorschau anzeigen ...