149 votes

Importer data.sql dans un conteneur Docker MySQL

Si j'ai un fichier data.sql, comment puis-je importer une base de données dans mon conteneur mysql docker? Comment puis-je importer des données de base de données. Dans un monde dockerisé 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"

0 votes

Copiez le fichier SQL dans le conteneur, puis chargez les données en utilisant LOAD DATA INFILE.

233voto

Lauri Points 2223

Vous pouvez importer la base de données ensuite :

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

31 votes

Si vous utilisez docker-compose, vous devez obtenir le conteneur par : docker exec -i $(docker-compose ps -q mysql-container) mysql …. Il ne prend pas en charge la lecture depuis stdin pour le moment, comme décrit ici.

2 votes

Comment faire cela sur docker-compose?

10 votes

Je suis. obtenir une erreur "le périphérique d'entrée n'est pas un TTY"

130voto

Eugen Mayer Points 3882

Montez votre sql-dump sous /docker-entrypoint-initdb.d/votrefichier.sql en utilisant un montage de 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 l'import du sql-dump lors du démarrage du conteneur, voir https://hub.docker.com/_/mysql/ sous "Initialiser une nouvelle instance"

3 votes

+1 @EugenMayer. Certainement, toute personne utilisant Compose v1 devrait passer à la syntaxe v3 la plus récente : docs.docker.com/compose/compose-file

2 votes

V3 n'est pas un successeur de V2, même si c'est gênant. V3 est essentiellement un essaim seulement, c'est plutôt une fourchette qu'un successeur. Voir les commentaires de Dockers à ce sujet. Un des énormes problèmes est le manque de possibilité de montage de volume_from.

33 votes

Les gars, n'oubliez pas que si vous créez un volume persistant pour le service de la base de données, il ne vérifiera pas les nouveaux fichiers .sql à moins que vous ne le recréiez. J'ai perdu quelques heures à cause de cela, j'espère que personne d'autre ne vivra la même chose.

77voto

Hana Alaydrus Points 1327

Je ne semble pas réussir à faire fonctionner cela avec le dernier mysql ou mysql:5.7. Je préfère donc utiliser 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:

1 votes

Lorsque j'essaie d'utiliser cette méthode, je me retrouve avec un répertoire pour dump.sql? Une idée de pourquoi? Par exemple, entrer dans le conteneur mariadb : cd /docker-entrypoint-initdb.d/dump.sql/ & ensuite je suis dans un répertoire? Qu'est-ce qui pourrait causer la création d'un répertoire au lieu de ne pas avoir le fichier .sql du tout ou de générer une sorte d'erreur? Mon docker-compose.yml pertinent pour le conteneur mariadb: mariadb : image: mariadb:latest ... volumes: - app-vhosts:/path/before/sqldump #crée un répertoire? - ./path/to/sql/dump.sql:/docker-entrypoint-initdb.d/dump.sql

0 votes

N'oubliez pas de supprimer d'abord les volumes avant de tester, car le fichier ne sera exécuté qu'au démarrage initial. docker-compose down --volumes && docker-compose rm -v && docker-compose up

32voto

Une autre option si vous ne voulez pas monter un volume, mais que vous voulez transférer un fichier depuis votre machine locale, est de rediriger la sortie de cat votrefichier.sql. Comme ceci :

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

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

0 votes

Fonctionne parfaitement si dump.sql contient des fichiers source

0 votes

Juste ce dont j'avais besoin pour faire fonctionner l'importation SQL dans mon script shell. Merci!

15voto

Kamika Points 328

Importer en utilisant docker-compose

cat dump.sql | docker-compose exec -T  mysql -u  -p

0 votes

Je reçois une erreur - mysql: [Avertissement] L'utilisation d'un mot de passe sur l'interface en ligne de commande peut être insecure. ERREUR 1064 (42000) à la ligne 1 : Vous avez une erreur dans votre syntaxe SQL ; vérifiez le manuel correspondant à la version de votre serveur MySQL pour la syntaxe correcte à utiliser près de 'mysqldump: [Avertissement] L'utilisation d'un mot de passe sur l'interface en ligne de comma' à la ligne 1 read unix @->/var/run/docker.sock: read: connection reset by peer

0 votes

Veuillez vérifier que cet avertissement n'apparaît pas déjà dans votre dump.sql : Lorsque vous avez produit le fichier en utilisant mysqldump et que vous avez donné le mot de passe en ligne de commande, l'avertissement se retrouvera dans le fichier dumpé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X