2016-03-07 9 views
5

Próbuję hostować na docker aplikacji, która używa MySQL db. Używam funkcji tworzenia dokerów. mój plik yml wygląda następująco:Jak utworzyć bazę danych mysql db z komponentem Docker?

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 

Mam dbcreation.sql która tworzy schemat db i jest przechowywany w folderze yml. Kiedy uruchamiam plik yml wydaje się, że plik nie jest uruchomiony.

Co przeoczyłem?

+0

Co to jest data_sql i kiedy wywołujesz dbcreation.sql? – Mattia

+0

data_sql to po prostu wolumin, który utworzyłem, aby hostować plik tworzenia. Nie mogłem znaleźć innego sposobu, aby to zrobić, a ten też nie działa. –

+0

Wygląda na to, że montujesz data_sql w dbcreation.sql. Nigdy nie tworzysz bazy danych. Musisz skopiować plik/var/lib/mysql (a nie dbcreation.sql, jeśli chcesz go użyć, musisz wykonać coś takiego: mysql -u użytkownik db Mattia

Odpowiedz

10

1) Utwórz plik zrzutu dbcreation.sql

2) Tworzenie import.sh plik:

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

3) Tworzenie doker-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) Uruchom

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

Miałem problem z implementacją twojej odpowiedzi od gdy mój główny kontener się podniesie, potrzebuje zbudowanej bazy danych. Dał mi wiele wskazówek, jak dotrzeć tam, gdzie chcę. Podzielam tworzenie kontenera mysql na oddzielny plik yml. Zrobiłem plik SH z następującym plikiem: docker-compose -f mysql.yml do -d sleep 10; okno dokowane exec medyczne-mysql bash /tmp/import.sh dokowanie-dokowanie To działa. Czy istnieje lepszy sposób, aby upewnić się, że kontener mysql jest gotowy od snu? –

+0

@IzharLotem to nie dotyczy kontenera, chodzi o aplikację wewnątrz. Pojemnik jest gotowy, ale aplikacja w pojemniku tego nie robi. Musisz rozwiązać problem na poziomie aplikacji. Możesz sprawdzić stan bazy danych MySQL w swoim "głównym kontenerze" lub możesz nadpisać CMD wewnątrz pliku Dockerfile i umieścić flagę gdzieś po zakończeniu importu. W każdym razie nie jest to praca w doku. – ashatrov

+0

To działa, @atatrov Dzięki – Devang

3

Wystarczy tylko umieścić plik .sql (dbcreation.sql) w katalogu (tj./Mysql_init) i dodać folder jako wolumin tak:

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

MySQL obraz będzie wykonywał wszystkie .sql, .sh i plików .sql.gz w /docker-entrypoint-initdb.d na starcie.

Powiązane problemy