Próbuję utworzyć kontener z bazą danych MySQL i dodać schemat do tej bazy danych.
Mój obecny plik Dockerfile to:
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
COPY files/epcis_schema.sql /data/epcis_schema.sql
# Change the working directory
WORKDIR data
CMD mysql -u $MYSQL_USER -p $MYSQL_PASSWORD $MYSQL_DATABASE < epcis_schema.sql
W celu stworzenia kontenera kieruję się dokumentacją dostarczoną na Dockerze i wykonuję to polecenie:
docker run --name ${CONTAINER_NAME} -e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} -e MYSQL_USER=${DB_USER} -e MYSQL_PASSWORD=${DB_USER_PASSWORD} -e MYSQL_DATABASE=${DB_NAME} -d mvpgomes/epcisdb
Ale kiedy wykonuję to polecenie, kontener nie jest tworzony, aw statusie kontenera można zobaczyć, że CMD nie został wykonany pomyślnie, w rzeczywistości mysql
wykonywane jest tylko polecenie.
W każdym razie, czy istnieje sposób na zainicjowanie bazy danych za pomocą schematu, czy też muszę ręcznie wykonać te operacje?
mysql
docker
database-schema
Marcus Gomes
źródło
źródło
Odpowiedzi:
Przepraszam za tę super długą odpowiedź, ale masz mały sposób, aby dotrzeć tam, gdzie chcesz. Powiem, że normalnie nie umieszczałbyś magazynu dla bazy danych w tym samym kontenerze co sama baza danych, albo montujesz wolumin hosta, aby dane pozostały na hoście dockera, albo być może kontener mógłby zostać użyty do przechowuj dane (/ var / lib / mysql). Poza tym jestem nowy w mysql, więc może to nie być super wydajne. To mówi...
Myślę, że może być kilka problemów. Plik Dockerfile służy do tworzenia obrazu. Musisz wykonać krok kompilacji. Jako minimum z katalogu zawierającego plik Dockerfile możesz zrobić coś takiego:
Plik Dockerfile opisuje obraz do utworzenia. Nie wiem zbyt wiele o mysql (jestem fanboyem postgres), ale przeszukałem interwebów pod kątem „jak zainicjować kontener docker mysql”. Najpierw utworzyłem nowy katalog do pracy, nazwałem go mdir, a następnie utworzyłem katalog plików, w którym zdeponowałem plik epcis_schema.sql, który tworzy bazę danych i pojedynczą tabelę:
Następnie utworzyłem skrypt o nazwie init_db w katalogu plików:
(większość tego skryptu została pobrana stąd: https://gist.github.com/pda/9697520 )
Oto utworzone przeze mnie pliki / skrypt run_db:
Na koniec plik Dockerfile, aby powiązać je wszystkie:
Tak więc przeszedłem do mojego katalogu mdir (który zawiera plik Dockerfile wraz z katalogiem plików). Następnie wykonuję polecenie:
Powinieneś zobaczyć takie dane wyjściowe:
Masz teraz obraz „7f6d5215fe8d”. Mogę uruchomić ten obraz:
i obraz się uruchamia, widzę ciąg instancji:
Mógłbym wtedy go „zatrzymać” i uruchomić ponownie.
Jeśli spojrzysz na logi, pierwsza linia będzie zawierać:
Następnie na końcu dzienników:
Są to komunikaty ze skryptu / tmp / run_db, pierwsza wskazuje, że baza danych została rozpakowana z zapisanej (początkowej) wersji, druga wskazuje, że baza już tam była, więc została wykorzystana istniejąca kopia.
Oto ls -lR struktury katalogów, którą opisałem powyżej. Zauważ, że init_db i run_db to skrypty z ustawionym bitem wykonania:
źródło
init_db
skryptu.RUN
poleceniu i problem najwyraźniej został rozwiązany. Ale kiedy wykonujędocker run
, mam ten sam problem zerun_db
skryptem.Miałem ten sam problem, w którym chciałem zainicjować schemat mojej instancji MySQL Docker, ale napotkałem trudności z jego działaniem po wykonaniu niektórych Googling i podążaniu za przykładami innych. Oto jak to rozwiązałem.
1) Zrzuć schemat MySQL do pliku.
2) Użyj polecenia ADD, aby dodać plik schematu do
/docker-entrypoint-initdb.d
katalogu w kontenerze Docker.docker-entrypoint.sh
Plik będzie uruchamiać żadnych plików w tym katalogu kończącego się".sql"
z bazą danych MySQL.Dockerfile:
3) Uruchom instancję Docker MySQL.
Dzięki skonfigurowaniu MySQL i zaimportowaniu zrzutu w ramach pliku Dockerfile za podpowiedź do pliku docker-entrypoint.sh oraz fakt, że uruchamia on zarówno skrypty SQL, jak i skrypty powłoki!
źródło
schema.sql
? Chcę, aby moja baza danych była odpowiednio aktualizowana. Co się stanie, gdy zbuduję ten kontener po raz drugi? Czy db zostanie zniszczony i utworzony ponownie?Inny sposób oparty na połączeniu wcześniejszych odpowiedzi serwera:
plik docker-compose:
gdzie
/home/user
.. to folder współdzielony na hościeA w
/home/user/db/mysql/init
folderze ... po prostu upuść jeden plik sql o dowolnej nazwie, na przykładinit.sql
zawierający:Zgodnie z oficjalną dokumentacją mysql możesz umieścić w nim więcej niż jeden plik sql
docker-entrypoint-initdb.d
, są one wykonywane w kolejności alfabetycznejźródło
Innym prostym sposobem jest użycie docker-compose z następującymi wierszami:
Umieść schemat bazy danych w pliku ./database/install_db.sql. Za każdym razem, gdy budujesz kontener, zostanie wykonany plik install_db.sql.
źródło
Wypróbowałem odpowiedź Grega bez powodzenia, musiałem zrobić coś złego, ponieważ moja baza danych nie zawierała danych po wszystkich krokach: na wszelki wypadek korzystałem z najnowszego obrazu MariaDB.
Następnie zdecydowałem się przeczytać punkt wejścia dla oficjalnego obrazu MariaDB i użyłem go do wygenerowania prostego pliku docker-compose :
Teraz mogę utrwalać moje dane ORAZ generować bazę danych z własnym schematem!
źródło
Po 4 sierpnia 2015 r., Jeśli korzystasz z oficjalnego obrazu mysql Docker, możesz po prostu DODAĆ / SKOPIOWAĆ plik do katalogu /docker-entrypoint-initdb.d/ i będzie on działał po zainicjowaniu kontenera. Zobacz github: https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225, jeśli chcesz go zaimplementować na innych obrazach kontenerów
źródło
Najłatwiejszym rozwiązaniem jest użycie tutum / mysql
Krok 1
Krok 2
Krok 3
Wejdź powyżej CONTAINER_ID, a następnie wykonaj polecenie,
docker logs
aby zobaczyć wygenerowane informacje o haśle.źródło
tutum/mysql:5.5
i się udało.docker run -d -p 3306:3306 -v /tmp:/tmp -e MYSQL_PASS="admin" -e STARTUP_SQL="/tmp/mysqldump.mysql" tutum/mysql:5.5
. Zawsze możesz wykonać polecenie,docker logs CONTAINER_ID
aby zobaczyć komunikaty o błędach, jeśli napotkasz problemy./tmp/to_be_imported.mysql
. czy to ścieżka w systemie operacyjnym hosta? gdzie jestCOPY
lubADD
umieścić rzeczy w systemie plików kontenera?COPY
/ADD
ponieważ katalog hosta / tmp jest zamontowany do / tmp kontenera. Przyjrzyj się uważnie poleceniu, które jest częścią-v /tmp:/tmp
. Osobiście nie zamontowałbym woluminu tylko po to, aby udostępnić plik do kontenera, ale myślę, że jest to osobisty wybór.Dla tych, którzy nie chcą tworzyć skryptu punktu wejścia, takiego jak ja, możesz uruchomić mysqld w czasie kompilacji, a następnie wykonać polecenia mysql w pliku Dockerfile w następujący sposób:
Kluczem jest tutaj wysłanie mysqld_safe do tła z pojedynczym
&
znakiem.źródło
Poniżej znajduje się plik Dockerfile, którego z powodzeniem użyłem do zainstalowania xampp, utworzenia MariaDB ze schematem i wstępnie wypełnionego informacjami używanymi na serwerze lokalnym (usrs, zamówienia zdjęć itp.)
źródło
Po trochę zmaganiach z tym, spójrz na plik Dockerfile przy użyciu nazwanych woluminów (db-data). Ważne jest zadeklarowanie plusa w końcowej części, gdzie wspomniałem, że wolumen jest
[external]
W ten sposób wszystko działało świetnie!
źródło