Jeśli mam plik data.sql, jak mogę zaimportować bazę danych do mojego kontenera docker mysql? Jak mogę zaimportować dane z bazy danych. W zdokeryzowanym świecie dodaje to warstwę złożoności. proszę o jakieś metody.
Tutaj mój docker-compose.yml:
nginx:
build: ./nginx/
container_name: nginx-container
ports:
- 80:80
links:
- php
volumes_from:
- app-data
php:
build: ./php/
container_name: php-container
expose:
- 9000
links:
- mysql
volumes_from:
- app-data
app-data:
image: php:7.0-fpm
container_name: app-data-container
volumes:
- ./www/html/:/var/www/html/
command: "true"
mysql:
image: mysql:latest
container_name: mysql-container
ports:
- 3306:3306
volumes_from:
- mysql-data
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: name_db
MYSQL_USER: user
MYSQL_PASSWORD: password
mysql-data:
image: mysql:latest
container_name: mysql-data-container
volumes:
- /var/lib/mysql
command: "true"
Odpowiedzi:
Nie wydaje mi się, aby ta działała z najnowszym mysql lub mysql: 5.7. Więc zamiast tego używam mariaDB. Oto mój
docker-compose.yaml
kod.źródło
cd /docker-entrypoint-initdb.d/dump.sql/
a potem jestem w katalogu? Co spowodowałoby utworzenie katalogu zamiast całkowitego braku pliku .sql lub wyrzucenia jakiegoś błędu? mój odpowiedni docker-compose.yml dla kontenera mariadb:mariadb: image: mariadb:latest ... volumes: - app-vhosts:/path/before/sqldump #creates a directory? - ./path/to/sql/dump.sql:/docker-entrypoint-initdb.d/dump.sql
Możesz później zaimportować bazę danych:
docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql
źródło
docker exec -i $(docker-compose ps -q mysql-container) mysql …
. W tej chwili nie obsługuje czytania ze standardowego wejścia, jak opisano tutaj .-p
bez hasła ze względów bezpieczeństwa.-t
opcji dladocker exec
? Używaj tylko,-i
aby uniknąć błęduZamontuj swój sql-dump pod
/docker-entrypoint-initdb.d/yourdump.sql
używając montowania woluminuSpowoduje to importowanie zrzutu sql-dump podczas uruchamiania kontenera, patrz https://hub.docker.com/_/mysql/ w sekcji „Inicjowanie nowej instancji”
źródło
Inną opcją, jeśli nie chcesz montować woluminu, ale chcesz zrzucić plik z komputera lokalnego, jest potokowanie
cat yourdump.sql
. Tak jak to:Zobacz: https://gist.github.com/spalladino/6d981f7b33f6e0afe6bb
źródło
dump.sql
zawierasource
plikiImportuj przy użyciu docker-compose
źródło
Mogę importować za pomocą tego polecenia
źródło
docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql
. Poza tym myślę, że w twoim oświadczeniu jest błąd. Pomiędzy-u
nazwą użytkownika a samą nazwą użytkownika powinna znajdować się spacja .połącz https://stackoverflow.com/a/51837876/1078784 i odpowiedzi w tym pytaniu, myślę, że najlepszą odpowiedzią jest:
cat {SQL FILE NAME} | docker exec -i {MYSQL CONTAINER NAME} {MYSQL PATH IN CONTAINER} --init-command="SET autocommit=0;"
na przykład w moim systemie polecenie to powinno wyglądać następująco:
cat temp.sql | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"
możesz również użyć pv do monitorowania postępów:
cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"
Najważniejszą rzeczą jest "--init-command", która przyspieszy import 10 razy.
źródło
możesz wykonać te proste kroki:
PIERWSZY SPOSÓB:
najpierw skopiuj plik zrzutu SQL z katalogu lokalnego do kontenera mysql. użyj polecenia docker cp
a następnie uruchom kontener mysql za pomocą (UWAGA: w przypadku korzystania z wersji alpine musisz zastąpić bash sh w podanym poniżej poleceniu).
a następnie możesz po prostu zaimportować ten plik zrzutu SQL.
DRUGI SPOSÓB: PROSTY
Jak wspomniano na oficjalnej stronie mysql Docker hub.
Za każdym razem, gdy kontener jest uruchamiany po raz pierwszy, tworzona jest nowa baza danych o określonej nazwie w zmiennej MYSQL_DATABASE - którą można przekazać, konfigurując zmienną środowiskową. Zobacz tutaj, jak ustawić zmienne środowiskowe
Domyślnie kontener będzie wykonywać pliki z rozszerzeniami .sh, .sql i .sql.gz, które znajdują się w folderze /docker-entrypoint-initdb.d. Pliki zostaną wykonane w kolejności alfabetycznej. w ten sposób Twoje pliki SQL zostaną domyślnie zaimportowane do bazy danych określonej przez zmienną MYSQL_DATABASE.
aby uzyskać więcej informacji, zawsze możesz odwiedzić oficjalną stronę
źródło
Próbowanie
"docker exec ... < data.sql"
odpowiedzi programu Window PowerShell z:Ale można to zakończyć,
cmd /c
aby wyeliminować problem:źródło
Możesz uruchomić kontener, ustawiając katalog współdzielony (-v wolumin), a następnie uruchomić bash w tym kontenerze. Następnie możesz interaktywnie użyć klienta mysql do wykonania pliku .sql z wnętrza kontenera. obs: / my-host-dir / shared-dir to lokalizacja .sql w systemie hosta.
docker run --detach --name=test-mysql -p host-port:container-port --env="MYSQL_ROOT_PASSWORD=my-root-pswd" -v /my-host-dir/shared-dir:/container-dir mysql:latest docker exec -it test-mysql bash
Wewnątrz pojemnika ...
Parametry niestandardowe:
źródło
Ten działa dla mnie
$ docker exec -i NAME_CONTAINER_MYSQL mysql -u DB_USER -pPASSWORD DATABASE < /path/to/your/file.sql
Po pierwsze, jeśli chcesz wiedzieć, co to jest NAME_CONTAINER_MYSQL, powinieneś użyć poniższego polecenia:
$ docker ps
W kolumnie wyjściowej NAZWA zobaczysz NAZWĘ_KONTAINER_MYSQL, którą należy zastąpić w powyższym poleceniu.
źródło
zrób
docker cp file.sql <CONTAINER NAME>:/file.sql
pierwszynastępnie
docker exec -i <CONTAINER NAME> mysql -u user -p
następnie wewnątrz kontenera mysql wykonaj
source \file.sql
źródło
możesz skopiować plik eksportu np. dump.sql za pomocą docker cp do kontenera, a następnie zaimportować plik db. jeśli potrzebujesz pełnych instrukcji, daj mi znać, a ja udzielę
źródło