2016-03-07 10 views
5

Ich versuche auf Docker eine Anwendung zu hosten, die MySQL db verwendet. Ich benutze Docker komponieren. meine yml Datei sieht wie folgt aus:Wie kann ich eine mysql db mit Docker komponieren erstellen?

version: '2' 
volumes: 
    data_sql:  
services: 
medical-mysql: 
    image: mysql 
    hostname: medical-mysql  
    volumes:  
    - data_sql:/dbcreation.sql 
    environment: 
     MYSQL_DATABASE: Medical 
     MYSQL_ROOT_PASSWORD: root 
     STARTUP_SQL: data_sql 
    ports: 
    - "3306:3306" 
    medical-main: 
    build: . 
    ports: 
    - "8080:8080"  
    depends_on: 
    - medical-mysql 

ich eine dbcreation.sql haben, die das DB-Schema erstellt und ist in der yml Ordner gehalten. Wenn ich die Yml-Datei ausführe, scheint es, als ob die Datei nicht läuft.

Was habe ich verpasst?

+0

Also was ist data_sql und wenn Sie dbcreation.sql aufrufen? – Mattia

+0

data_sql ist einfach das Volume, das ich erstellt habe, um die Erstellungsdatei zu hosten. Ich konnte keinen anderen Weg finden, und dieser funktioniert auch nicht. –

+0

Es scheint, dass Sie data_sql in dbcreation.sql mounten. Sie erstellen niemals die Datenbank. Sie müssen in/var/lib/mysql (und nicht dbcreation.sql kopieren, wenn Sie es verwenden möchten, müssen Sie so etwas ausführen: mysql -u Benutzer db Mattia

Antwort

10

1) Erstellen Sie Dump-Datei dbcreation.sql

2) Erstellen import.sh Datei:

#!/usr/bin/env bash 
mysql -u root -p$MYSQL_ROOT_PASSWORD < /tmp/dbcreation.sql 

3) Erstellen Docker-compose.yaml

database: 
    image: mysql 
    container_name: database.dev 
    command: mysqld --user=root --verbose 
    volumes: 
    - ./dbcreation.sql:/tmp/dbcreation.sql 
    - ./import.sh:/tmp/import.sh 
    ports: 
    - "3306:3306" 
    environment: 
    MYSQL_DATABASE: "test" 
    MYSQL_USER: "test" 
    MYSQL_PASSWORD: "test" 
    MYSQL_ROOT_PASSWORD: "root" 
    MYSQL_ALLOW_EMPTY_PASSWORD: "yes" 

"- ./dbcreation.sql:/tmp/dbcrea tion.sql“- "- local_path: path_inside_container"

4) Führen

docker-compose up 
docker exec database.dev bash /tmp/import.sh 
+0

Ich hatte ein Problem mit der Umsetzung Ihrer Antwort seit Sobald mein Hauptcontainer aufgebraucht ist, muss die db erstellt werden. Es gab mir viele Hinweise darauf, wo ich hin wollte. Ich teile die mysql-Container-Erstellung in eine separate XML-Datei. Ich machte eine SH-Datei mit den folgenden: docker-compose -f mysql.yml up -d schlafen 10; docker exec medizinische-mysql bash /tmp/import.sh docker-komponieren Es funktioniert. Gibt es einen besseren Weg, um sicherzustellen, dass der MySQL-Container bereit ist als der Schlaf? –

+0

@IzharLotem es geht nicht um Container, es geht um die Anwendung im Inneren. Der Container ist bereit, aber die Anwendung im Container nicht. Sie müssen es auf Anwendungsebene lösen. Sie können den Zustand der MySQL-Datenbank in Ihrem "Hauptcontainer" überprüfen oder Sie können CMD innerhalb von Dockerfile überschreiben und irgendwo nach dem Import Flag setzen. Jedenfalls ist es kein Dockerjob. – ashatrov

+0

Das funktioniert, @ashatrov Danke – Devang

3

einfach nur Ihre SQL-Datei setzen (dbcreation.sql) in einem Ordner (dh./Mysql_init) und den Ordner als Volumen wie folgt hinzu:

volumes: 
    - /mysql_init:/docker-entrypoint-initdb.d 

Der MySQL-Bild alle .sql, .sh und .sql.gz Dateien in /docker-entrypoint-initdb.d beim Start wird ausgeführt.

Verwandte Themen