Importuj kontener data.sql MySQL Docker

91

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"
Israel Morales
źródło
Skopiuj plik SQL do kontenera, a następnie załaduj plik danych.
Jay Blanchard

Odpowiedzi:

61

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.yamlkod.

version: '3'

services:
  mysql:
    image: mariadb:10.3
    container_name: mariadb
    volumes:
      - container-volume:/var/lib/mysql
      - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: name_db
    ports:
      - "3306:3306"

volumes:
  container-volume:
Hana Alaydrus
źródło
Kiedy próbuję użyć tej metody, otrzymuję katalog na dump.sql? Masz jakiś pomysł, dlaczego? np. wbijanie do kontenera mariadb &: 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
K8sN0v1c3
156

Możesz później zaimportować bazę danych:

docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql

Lauri
źródło
23
W przypadku korzystania z Docker-komponować, trzeba uzyskać pojemnik przez: docker exec -i $(docker-compose ps -q mysql-container) mysql …. W tej chwili nie obsługuje czytania ze standardowego wejścia, jak opisano tutaj .
slhck
2
jak to zrobić w docker-compose?
iamjc015
7
Jestem. pojawia się błąd „urządzenie wejściowe to nie TTY”
kamal
FYI: używaj -pbez hasła ze względów bezpieczeństwa.
Abdulla Nilam
2
@kamal czy użyłeś tej -topcji dla docker exec? Używaj tylko, -iaby uniknąć błędu
Wolfgang
88

Zamontuj swój sql-dump pod /docker-entrypoint-initdb.d/yourdump.sqlużywając montowania woluminu

mysql:
  image: mysql:latest
  container_name: mysql-container
  ports:
    - 3306:3306
  volumes:
    - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: name_db
    MYSQL_USER: user
    MYSQL_PASSWORD: password

Spowoduje to importowanie zrzutu sql-dump podczas uruchamiania kontenera, patrz https://hub.docker.com/_/mysql/ w sekcji „Inicjowanie nowej instancji”

Eugen Mayer
źródło
3
+1 @EugenMayer. Zdecydowanie każdy, kto używa Compose v1, powinien przejść do najnowszej składni v3: docs.docker.com/compose/compose-file
Mano Marks
1
V3 nie jest następcą V2, nawet jeśli jest to niedogodne. V3 jest w zasadzie tylko rojem, jest raczej widelcem niż następcą. Zobacz komentarze Dockers na ten temat. Jednym z ogromnych problemów jest brak możliwości montażu volumr_from
Eugen Mayer
21
Chłopaki, pamiętajcie, że jeśli utworzysz trwały wolumin dla usługi bazy danych, nie będzie on sprawdzał nowych plików .sql, chyba że go odtworzysz. Straciłem na to kilka godzin, mam nadzieję, że nikt inny nie przeżyje tego samego.
Dazag,
1
@DhwanilPatel musisz użyć opcji --build --force -rereate. docs.docker.com/compose/reference/up Np. docker -compose up --build --force
-reate
@Dazag Właściwie już używam tego polecenia: "sudo docker-compose up -d --force -rereate --build", ale nic się nie dzieje
Dhwanil Patel
24

Inną opcją, jeśli nie chcesz montować woluminu, ale chcesz zrzucić plik z komputera lokalnego, jest potokowanie cat yourdump.sql. Tak jak to:

cat dump.sql | docker exec -i mysql-container mysql -uuser -ppassword db_name

Zobacz: https://gist.github.com/spalladino/6d981f7b33f6e0afe6bb

Doskonałość Ilesanmi
źródło
Działa idealnie, jeśli dump.sqlzawiera sourcepliki
Chu
11

Importuj przy użyciu docker-compose

cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>
Strumień
źródło
Otrzymuję błąd - mysql: [Ostrzeżenie] Używanie hasła w interfejsie wiersza poleceń może być niebezpieczne. BŁĄD 1064 (42000) w wierszu 1: Wystąpił błąd w składni SQL; sprawdź podręcznik, który odpowiada Twojej wersji serwera MySQL, aby uzyskać właściwą składnię, której należy użyć w pobliżu 'mysqldump: [Ostrzeżenie] Używanie hasła w interfejsie wiersza poleceń może być insec' w linii 1 przeczytaj unix @ -> / var / run / docker. sock: read: reset połączenia przez peera
R Sun
pls sprawdź, czy to ostrzeżenie nie pojawia się już w twoim dump.sql: Kiedy utworzyłeś plik używając mysqldump i podałeś hasło w wierszu poleceń, ostrzeżenie trafi do zrzuconego pliku.
Stefan Frank
6

Mogę importować za pomocą tego polecenia

docker-compose exec -T mysql mysql -uroot -proot mydatabase < ~/Desktop/mydatabase_2019-10-05.sql
Son Goku
źródło
trudno powiedzieć, co jest czym, ale robię to w ten sam sposób 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 -unazwą użytkownika a samą nazwą użytkownika powinna znajdować się spacja .
Gordon Freeman
5

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.

Matt Cai
źródło
dostaję stdin to nie tty ... naprawdę się tym nudzę, jakie jest rozwiązanie tego problemu?
Bram B
Nie rozumiem, co masz na myśli, może możesz podać mi więcej szczegółów?
Matt Cai
3

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

docker cp [SRC-Local path to sql file] [container-name or container-id]:[DEST-path to copy to]

docker cp ./data.sql mysql-container:/home

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).

docker exec -it -u root mysql-container bash

a następnie możesz po prostu zaimportować ten plik zrzutu SQL.

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

DRUGI SPOSÓB: PROSTY

docker cp ./data.sql mysql-container:/docker-entrypoint-initdb.d/

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ę

Thakur Amit
źródło
2

Próbowanie "docker exec ... < data.sql"odpowiedzi programu Window PowerShell z:

Operator „<” jest zarezerwowany do użytku w przyszłości.

Ale można to zakończyć, cmd /caby wyeliminować problem:

cmd /c "docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql"
Denys Horobchenko
źródło
1

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 ...

mysql -p < /container-dir/file.sql 

Parametry niestandardowe:

  • test-mysql (nazwa kontenera)
  • port-hosta i port - kontenera
  • my-root-pswd (hasło root mysql)
  • / my-host-dir / shared-dir i / container-dir (katalog hosta, który zostanie zamontowany w kontenerze, oraz lokalizacja kontenera udostępnionego katalogu)
Caleb Santos
źródło
1

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.

Irwuin
źródło
0

zrób docker cp file.sql <CONTAINER NAME>:/file.sqlpierwszy

następnie docker exec -i <CONTAINER NAME> mysql -u user -p

następnie wewnątrz kontenera mysql wykonaj source \file.sql

Sakhri Houssem
źródło
-2

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ę

Jarjob
źródło