web-dev-qa-db-fra.com

Importer un conteneur data.sql MySQL Docker

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"
42
Israel Morales

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:
22
Hana Alaydrus

Vous pouvez importer la base de données par la suite:

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

80
Lauri

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

48
Eugen Mayer

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

13
Excellence Ilesanmi

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.

1
Matt.Cai

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:

  • test-mysql (nom du conteneur)
  • Host-port et conteneur-port
  • my-root-pswd (mot de passe mysql root)
  • / my-Host-dir/shared-dir et / container-dir (le répertoire de l'hôte qui sera monté dans le conteneur et l'emplacement du conteneur du répertoire partagé)

J'espère que cette aide.

0
Caleb Santos

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

0
Jarjob

Utiliser docker-compose

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