2016-05-04 9 views
0

Dokumentation für die mysql Docker Bild sagt:Docker Bild, um das mysql Bild erstreckt, ist nicht die initdb des Ausführen von Skripts

Wenn ein Behälter zum ersten Mal gestartet wird, [...] wird mit Erweiterungen Ausführen von Dateien .sh und .sql, die in /docker-entrypoint-initdb.d gefunden werden. Sie können Ihre mysql-Dienste problemlos füllen, indem Sie einen SQL-Speicherauszug in diesem Verzeichnis bereitstellen und benutzerdefinierte Images mit bereitgestellten Daten bereitstellen.

Also zuerst habe ich dies in meinem docker-compose.yml:

version: '2' 
services: 
    db: 
    image: mysql:5.7 
    volumes: 
     - .:/docker-entrypoint-initdb.d:ro 

Als ich docker-compose build und docker-compose up wurde der Behälter lief erstellt und die SQL-Dateien im aktuellen Verzeichnis ausgeführt wurden. Soweit alles gut.

Aber wenn ich will diese Container auf einem anderen Rechner implementieren (mit docker-machine), Montag /docker-entrypoint-initdb.d als ein Volumen wird nicht funktionieren, da die Maschine keinen Zugriff auf meine Maschine . Verzeichnis hat.

So dann habe ich versucht, das mysql:5.7 Bild zu verlängern:

FROM mysql:5.7 
COPY ./*.sql /docker-entrypoint-initdb.d/ 

Und tun dies in meinem docker-compose.yml

version: '2' 
services: 
    db: 
    build: 
     context: . 
     dockerfile: Dockerfile 

Allerdings, wenn ich dann docker-compose build und docker-compose up auf der zweiten Maschine laufen und versuchen, Führen Sie meine Anwendung, die *.sql Dateien im aktuellen Verzeichnis werden nicht ausgeführt. Keine meiner Tabellen sind erstellt.

Warum funktioniert mein zweiter Ansatz nicht?

EDIT: Ah, warte. Ich habe die falsche Frage gestellt. Das Problem ist nicht, dass der zweite Ansatz nicht funktioniert, sondern dass der zweite Ansatz nicht funktioniert, wenn er auf dem lokalen Docker-Rechner läuft, der in Virtualbox läuft. Der zweite Ansatz funktioniert tatsächlich, wenn ich ihn auf meiner Host-Maschine verwende (d. H. Keine Docker-Maschine).

+0

Können Sie die Protokolle veröffentlichen, wenn der Container zum ersten Mal ausgeführt wird?Was du hast, sieht gut aus, es ist wahrscheinlich etwas Einfaches. –

+0

Ah, warte. Ich habe die falsche Frage gestellt. Das Problem ist nicht, dass der zweite Ansatz nicht funktioniert, sondern dass der zweite Ansatz nicht funktioniert, wenn er auf dem lokalen "Docker-Rechner" läuft, der in Virtualbox läuft. Der zweite Ansatz funktioniert tatsächlich, wenn ich ihn auf meiner Host-Maschine verwende (d. H. Keine "docker-machine" benutze). –

+1

Ok, können Sie die Frage aktualisieren, und es wäre immer noch gut, die Logs zu sehen, um zu sehen, was vor sich geht. Es führt die .sql-Skripte nur beim ersten Start des Containers aus. Wenn Sie also Skripts nach dem ersten Start hinzugefügt haben, werden sie nicht ausgeführt. –

Antwort

0

Ich habe das Problem gefunden. Das Problem war, dass ich dachte, docker-compose rm -f zerstört alle Volumina an den Behältern befestigt, aber ich habe mich geirrt. Also, was ich dachte, war das erste oben: Ed Container verwendeten in der Tat die Datenbank von einem früheren erstellt. Also wurden die SQL-Dateien nicht ausgeführt, weil es nicht das erste Mal war, dass die Container gestartet wurden. Duh. Danke Ken, dass er mich in die richtige Richtung weist.

Stellt sich heraus, dass nicht einmal docker-compose rm -v die Volumes entfernt. Ich musste sie mit docker volume ls auflisten und sie dann manuell mit docker volume rm <volume> entfernen.

0

Ein weiterer Docker spezifisch Mengen aufzuräumen:

docker system prune

Dies entfernt Bilder, Container baumelt, Volumes und Netzwerke. Durch das Hinzufügen von -a werden auch abgelaufene Container und derzeit nicht verwendete Bilder entfernt.