TL;DR
Docker
überschreibt das Mounten eines Verzeichnisses die Informationen im Container, aber wenn Sie eine Datei mit Binden
mounten, wird sie nicht überschrieben.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.
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
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.