Importa data.sql MySQL Docker Container


91

Se ho un data.sql, come posso importare il database nel mio container docker mysql? Come posso importare i dati del database. In un mondo dockerizzato questo aggiunge uno strato di complessità. alcuni metodi per favore.

Qui il mio 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"

Copia il file SQL nel contenitore, quindi carica il file di dati.
Jay Blanchard

Risposte:


61

Non riesco a farlo funzionare con l'ultimo mysql o mysql: 5.7. Quindi uso mariaDB invece. Ecco il mio docker-compose.yamlcodice.

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:

Quando provo a utilizzare questo metodo, mi ritrovo con una directory per dump.sql? Qualche idea sul perché? eg: bash in mariadb container &: cd /docker-entrypoint-initdb.d/dump.sql/& then I'm in a directory? Cosa causerebbe la creazione di una directory invece di non avere affatto il file .sql o di generare qualche tipo di errore? il mio docker-compose.yml pertinente per il contenitore 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

155

È possibile importare il database in seguito:

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


23
Se si utilizza finestra mobile-composizione, è necessario ottenere il contenitore: docker exec -i $(docker-compose ps -q mysql-container) mysql …. Al momento non supporta la lettura da stdin, come descritto qui .
slhck

2
come farlo su docker-compose?
iamjc015

7
Sono. ottenere l'errore "il dispositivo di input non è un TTY"
kamal

FYI: utilizzare -psenza password per motivi di sicurezza.
Abdulla Nilam

2
@kamal hai usato l' -topzione per docker exec? Usa solo -iper evitare l'errore
Wolfgang

88

Monta il tuo sql-dump /docker-entrypoint-initdb.d/yourdump.sqlutilizzando un volume mount

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

Ciò attiverà un'importazione di sql-dump durante l'avvio del contenitore, vedere https://hub.docker.com/_/mysql/ in "Inizializzazione di una nuova istanza"


3
+1 @EugenMayer. Sicuramente chiunque utilizzi Compose v1 dovrebbe passare alla sintassi più recente v3: docs.docker.com/compose/compose-file
Mano Marks

1
V3 non è un successore di V2, anche se questo è un inconveniente. V3 è fondamentalmente solo uno sciame, è piuttosto un fork che un successore. Vedi i commenti di Dockers su questo. Uno dei grandi problemi è la mancanza di volumr_from possibilità di montaggio
Eugen Mayer,

21
Ragazzi, ricordate che se create un volume persistente per il servizio di database, non controllerà i nuovi file .sql a meno che non lo ricreate. Ho perso poche ore per questo, spero che nessun altro abbia passato lo stesso.
Dazag

1
@DhwanilPatel devi usare le opzioni --build --force-recreate. docs.docker.com/compose/reference/up Ad esempio docker -compose up --build --force-
recreate

@Dazag In realtà uso già questo comando: "sudo docker-compose up -d --force-recreate --build" ma non succede nulla
Dhwanil Patel


11

Importa utilizzando docker-compose

cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>

Ricevo un errore - mysql: [Avviso] L'uso di una password sull'interfaccia della riga di comando può non essere sicuro. ERRORE 1064 (42000) alla riga 1: hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'mysqldump: [Avvertenza] L'uso di una password sull'interfaccia della riga di comando può essere insec' alla riga 1 leggi unix @ -> / var / run / docker. calzino: leggi: connessione ripristinata da peer
R Sun

controlla che questo avviso non compaia già nel tuo dump.sql: quando hai prodotto il file usando mysqldump e hai fornito la password sulla riga di comando, l'avviso finirà nel file scaricato.
Stefan Frank

6

Posso importare con questo comando

docker-compose exec -T mysql mysql -uroot -proot mydatabase < ~/Desktop/mydatabase_2019-10-05.sql

è difficile dire cosa sia cosa, ma lo sto facendo allo stesso modo docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql. Oltre a questo penso che ci sia un errore nella tua dichiarazione. Dovrebbe esserci uno spazio tra -ue il nome utente stesso.
Gordon Freeman

5

combina https://stackoverflow.com/a/51837876/1078784 e risponde a questa domanda, penso che la risposta migliore sia:

cat {SQL FILE NAME} | docker exec -i {MYSQL CONTAINER NAME} {MYSQL PATH IN CONTAINER} --init-command="SET autocommit=0;"

ad esempio nel mio sistema questo comando dovrebbe essere simile a:

cat temp.sql | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

inoltre puoi usare pv per monitorare i progressi:

cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

E la cosa più importante qui è "--init-command" che accelera il progresso dell'importazione 10 volte più velocemente.


ottengo stdin non è un tty ... annoiarsi davvero con questo, qual è la soluzione a questo?
Bram B

Non capisci cosa intendi, forse puoi darmi maggiori dettagli?
Matt.Cai

3

puoi seguire questi semplici passaggi:

PRIMO MODO:

prima copia il file di dump SQL dalla tua directory locale al contenitore mysql. utilizzare il comando 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

e quindi eseguire mysql-container utilizzando (NOTA: nel caso in cui si utilizzi la versione alpine è necessario sostituire bash con sh nel comando indicato di seguito.)

docker exec -it -u root mysql-container bash

e quindi puoi semplicemente importare questo file di dump SQL.

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

SECONDO MODO: SEMPLICE

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

Come menzionato nella pagina ufficiale dell'hub Docker mysql.

Ogni volta che un contenitore si avvia per la prima volta, viene creato un nuovo database con il nome specificato nella variabile MYSQL_DATABASE - che puoi passare impostando la variabile d'ambiente vedi qui come impostare le variabili d'ambiente

Per impostazione predefinita, il contenitore eseguirà file con estensioni .sh, .sql e .sql.gz che si trovano nella cartella /docker-entrypoint-initdb.d. I file verranno eseguiti in ordine alfabetico. in questo modo i file SQL verranno importati per impostazione predefinita nel database specificato dalla variabile MYSQL_DATABASE.

per maggiori dettagli puoi sempre visitare la pagina ufficiale


2

Provando "docker exec ... < data.sql"in Windows le risposte di PowerShell con:

L'operatore "<" è riservato per usi futuri.

Ma si può concludere cmd /cper eliminare il problema:

cmd /c "docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql"

1

Puoi eseguire un contenitore impostando una directory condivisa (-v volume), quindi eseguire bash in quel contenitore. Dopodiché, puoi utilizzare interattivamente mysql-client per eseguire il file .sql, dall'interno del contenitore. obs: / my-host-dir / shared-dir è la posizione .sql nel sistema host.

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

All'interno del contenitore ...

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

Parametri personalizzati:

  • test-mysql (nome contenitore)
  • host-port e container-port
  • my-root-pswd (password di root mysql)
  • / my-host-dir / shared-dir e / container-dir (la directory host che verrà montata nel contenitore e la posizione del contenitore della directory condivisa)

1

Questo funziona per me

$ docker exec -i NAME_CONTAINER_MYSQL mysql -u DB_USER -pPASSWORD DATABASE < /path/to/your/file.sql

Per prima cosa, se vuoi sapere cos'è NAME_CONTAINER_MYSQL, dovresti usare questo comando di seguito:

$ docker ps

Nella colonna di output NAME vedrai NAME_CONTAINER_MYSQL che devi sostituire nel comando sopra.


0

fare docker cp file.sql <CONTAINER NAME>:/file.sql prima

poi docker exec -i <CONTAINER NAME> mysql -u user -p

quindi all'interno del contenitore mysql eseguire source \file.sql


-2

è possibile copiare il file di esportazione per es. dump.sql utilizzando docker cp nel contenitore e quindi importare il db. se hai bisogno di istruzioni complete, fammi sapere e ti fornirò

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.