Si j'ai un fichier data.sql, comment puis-je importer une base de données dans mon conteneur mysql docker? Comment je peux importer des données de base de données. Dans un monde dockérisé, cela ajoute une couche de complexité. Quelques méthodes s'il vous plaît.
Voici mon 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"
Je n'arrive pas à faire fonctionner cela avec les derniers mysql ou mysql: 5.7. Donc, j'utilise mariaDB à la place. Voici mon code docker-compose.yaml
.
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:
Vous pouvez importer la base de données par la suite:
docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql
Montez votre sql-dump sous/docker-entrypoint-initdb.d/yourdump.sql
en utilisant un montage en volume
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
Cela déclenchera une importation de sql-dump au début du conteneur, voir https://hub.docker.com/_/mysql/ sous "Initialisation d'une nouvelle instance".
Une autre option si vous ne voulez pas monter un volume, mais vider un fichier de votre ordinateur local, consiste à rediffuser cat yourdump.sql
. Ainsi:
cat dump.sql | docker exec -i mysql-container mysql -uuser -ppassword db_name
Voir: https://Gist.github.com/spalladino/6d981f7b33f6e0afe6bb
combine https://stackoverflow.com/a/51837876/1078784 et répond à cette question, je pense que la meilleure réponse est:
cat {SQL FILE NAME} | docker exec -i {MYSQL CONTAINER NAME} {MYSQL PATH IN CONTAINER} --init-command="SET autocommit=0;"
par exemple, dans mon système, cette commande devrait ressembler à ceci:
cat temp.sql | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"
vous pouvez aussi utiliser pv pour surveiller les progrès:
cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"
Et la chose la plus importante ici est "--init-command" qui accélérera la progression de l'importation 10 fois plus rapidement.
Vous pouvez exécuter un conteneur en définissant un répertoire partagé (volume -v), puis exécuter bash dans ce conteneur. Ensuite, vous pouvez utiliser mysql-client de manière interactive pour exécuter le fichier .sql à partir du conteneur. obs:/my-Host-dir/shared-dir est l'emplacement .sql du système hôte.
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
À l'intérieur du conteneur ...
mysql -p < /container-dir/file.sql
Paramètres personnalisés:
J'espère que cette aide.
vous pouvez copier le fichier d'exportation pour, par exemple, dump.sql à l'aide de docker cp dans le conteneur, puis importer la base de données. si vous avez besoin d'instructions complètes, faites-le moi savoir et je vous fournirai
Utiliser docker-compose
cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>