2016-07-21 12 views
4

Ich versuche, mehrere Datenbanken zu erstellen, wenn ein MySQL-Container gestartet wird. Nach https://github.com/docker-library/mysql/pull/18 kann ich meine Skripte in der /docker-entrypoint-initdb.d des Bildes mounten oder kopieren und sie werden beim Start automatisch ausgeführt.MySQL-Skripte in docker-entrypoint-initdb werden nicht ausgeführt

Allerdings sind meine Skripte überhaupt nicht ausgeführt. Scheint wie die docker-entrypoint.sh Dateien im /docker-entrypoint-initdb.d Verzeichnis nicht zu sehen.

Das ist mein Dockerfile:

FROM mysql 
ADD script.sql /docker-entrypoint-initdb.d/script.sql 
RUN chmod -R 775 /docker-entrypoint-initdb.d 

ENV MYSQL_ROOT_PASSWORD mypass 

Dies ist mein script.sql:

CREATE DATABASE mydb; 
CREATE DATABASE mydb2; 

ich bauen und den Behälter laufen:

$ docker build -t mysql . 
$ docker run -v data_volume:/var/lib/mysql --name somedb -d mysql 

Wenn ich den Behälter in tty ich zugreifen kann sehen, dass die script.sql in der /docker-entrypoint-initdb.d aber ist wird nicht ausgeführt.

Ich habe die docker logs -f somedb Ausgabe gesehen, aber es gibt keinen Fehler.

Ich habe mit .sh Datei versucht, ich habe auch mit Maria-db versucht, das Ergebnis ist das gleiche.

Was könnte das Problem sein?

Antwort

0

nicht wirklich eine Antwort auf dieses Verhalten, aber ich tue es in der Regel wie folgt aus:

RUN mkdir -p /docker-entrypoint-initdb.d && mv myScript.sql /docker-entrypoint-initdb.d/myScript.sql 

glaube nicht, dass es etwas falsch mit Ihrem Code, aber wer weiß. Ich nehme an, Sie haben überprüft, 775 ist der richtige Besitzer? btw im mit FROM mysql: 5

+0

Diese Konfiguration hat das Problem nicht gelöst. Ich habe überprüft, dass die Datei ausführbar ist. Ich vermute, das Problem liegt in der Datenmenge. Ich arbeite weiter daran danke. –

3

Bitte machen Sie data_volume leer, bevor Sie Ihren Container ausführen. Und Ihre SQL-Dateien werden mit Sicherheit ausgeführt.

Probleme hier:

In docker-entrypoint.sh können das überprüfen Sie den ersten Lauf unter Verwendung exist von mysql-Verzeichnis in/var/lib/mysql

if [ ! -d "$DATADIR/mysql" ]; then 
    //Some other logic here 

    for f in /docker-entrypoint-initdb.d/*; do 
     case "$f" in 
      *.sh)  echo "$0: running $f"; . "$f" ;; 
      *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f"; echo ;; 
      *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;; 
      *)  echo "$0: ignoring $f" ;; 
     esac 
     echo 
    done 

Sie bei Dockerfile source ausführliche Informationen erhalten

1

Haben Sie das Problem schon gelöst?

Eine einfache Abhilfe ist absoluten Pfad zu verwenden, wenn Dateien in /docker-entrypoint-initdb.d/

Lese ich meinen Test unter Verwendung der Standardkonfiguration von gemacht: https://github.com/docker-library/mysql/blob/master/5.7/Dockerfile#L70

Die docker-entrypoint.sh wird vor der Ausführung zuerst nach/usr/local/bin verschoben.

Dann kommt es Dateien in /docker-entrypoint-initdb.d/ zu lesen, aber die folgenden:

for f in /docker-entrypoint-initdb.d/*; do 

nichts zu finden scheint.

Wenn Sie ersetzen es mit:

for f in /usr/local/bin/docker-entrypoint-initdb.d/*; do 

und dann stellen Sie sicher, dass der Ordner, der vom Dockerfile Befehl aufgefüllt wird:

COPY docker-entrypoint.sh /usr/local/bin/ 
RUN chmod +x /usr/local/bin/docker-entrypoint.sh 

COPY docker-entrypoint-initdb.d/ /usr/local/bin/docker-entrypoint-initdb.d/ 
RUN chmod -R +x /usr/local/bin/docker-entrypoint-initdb.d 

Von dort bauen eine Test Anweisung in/Docker-entrypoint- initdb.d/test.sql

CREATE DATABASE `test`; 

Schließlich bauen und das Bild laufen und Sie sollten Ihre Datenbank creat sehen ed.

+0

Sie meinen, editieren von mysql's Dockerfile? Wenn das so ist, hoffe ich, dass es eine bessere Lösung gibt. – JulienD

Verwandte Themen