Docker Compose mysql import .sql
J'ai du mal à importer un fichier de vidage .sql avec docker-compose. J'ai suivi les documents, qui apparemment chargeront le fichier .sql à partir de docker-entrypoint-initdb.d. Cependant, lorsque je lance docker-compose up
, le fichier sql n'est pas copié dans le conteneur.
J'ai essayé d'arrêter les conteneurs avec -vf
flag, mais cela n'a pas fonctionné non plus. Suis-je en train de faire quelque chose de mal dans mon script .yml?
J'ai dump.sql dans le répertoire database/db-dump/à la racine où se trouve mon fichier de composition.
frontend:
image: myimage
ports:
- "80:80"
links:
- mysql
mysql:
image: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_USER: dbuser
MYSQL_PASSWORD: userpass
MYSQL_DATABASE: myimage_db
volumes:
- ./database/db-dump:/docker-entrypoint-initdb.d
Après de nombreuses tentatives avec le réglage des volumes, j'ai trouvé une solution de contournement
J'ai créé une autre image basée sur mysql avec ce qui suit dans le Dockerfile
FROM mysql:5.6
ADD dump.sql /docker-entrypoint-initdb.d
Ensuite, supprimé les volumes de composer et exécuté la nouvelle image
frontend:
image: myimage
ports:
- "80:80"
links:
- mysql
mysql:
image: mymysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_USER: dbuser
MYSQL_PASSWORD: userpass
MYSQL_DATABASE: myimage_db
De cette façon, le vidage est toujours copié et exécuté au démarrage
Cela a fonctionné pour moi,
version: '3.1'
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
volumes:
- ./mysql-dump:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: ecommerce
adminer:
image: adminer
restart: always
ports:
- 8080:8080
mysql-dump doit être un répertoire. Tous les .sql du répertoire seront importés.
Cela apparaît sur la page de documentation de l'image Docker MySQL: https://hub.docker.com/_/mysql/
Initialisation d'une nouvelle instance
Lorsqu'un conteneur est démarré pour la première fois, une nouvelle base de données avec le nom spécifié sera créée et initialisée avec les variables de configuration fournies. De plus, il exécutera des fichiers avec des extensions
.sh
,.sql
et.sql.gz
qui se trouvent dans /docker-entrypoint-initdb.d. Les fichiers seront exécutés par ordre alphabétique. Vous pouvez facilement remplir vos services mysql en en montant un vidage SQL dans ce répertoire et en fournissant images personnalisées avec les données apportées. Les fichiers SQL seront importés par défaut dans la base de données spécifiée par leMYSQL_DATABASE
variable.
Le vidage de la base de données Mysql schema.sql réside dans le répertoire / mysql-dump/schema.sql et crée des tables pendant le processus d'initialisation.
docker-compose.yml:
mysql:
image: mysql:5.7
command: mysqld --user=root
volumes:
- ./mysql-dump:/docker-entrypoint-initdb.d
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
J'avais un problème similaire avec mysql où je montais un répertoire local dans/configs/mysql/data contenant un fichier mydatabasedump.sql via docker-compose sur le volume docker-entrypoint-initdb.d, le fichier était chargé sur le conteneur mais pas exécuter ou remplir la base de données lors de l'initialisation du conteneur. Mon docker-compose.yml initial ressemble à ceci:
#docker-compose.yml
version: '3'
services:
db:
build: ./build/mysql/ #this is pointing to my Dockerfile
container_name: MYSQL_Database
restart: always
environment:
MYSQL_PORT: 3306
MYSQL_ROOT_PASSWORD: admin
MYSQL_DATABASE: my_app_database
MYSQL_USER: admin
MYSQL_PASSWORD: admin
volumes:
- ./configs/mysql/data:/docker-entrypoint-initdb.d:
J'ai trouvé deux solutions de travail pour ce problème:
Le premier est venu après que je me suis connecté au conteneur en cours d'exécution et ai confirmé que le fichier mydatabasedump.sq était présent et exécutable dans le répertoire docker-entrypoint-initdb.d du conteneur; J'ai créé et ajouté un script bash à mon répertoire local/configs/mysql/data appelé dump.sh qui a été exécuté après l'initialisation du conteneur. Il contient une seule commande mysql qui copie my_database_dump.sql dans my_app_database. Le script bash ressemble à ceci
#!/bin/bash
#dump.sh
mysql -uadmin -padmin my_app_database < my_database_dump.sql
#end of dump.sh
J'ai exécuté ce script via mon Dockerfile dans la directive ENTRYPOINT comme ceci:
#Dockerfile
FROM mysql:5.5
ENTRYPOINT [ "dump.sh" ]
EXPOSE 80
#end of Dokerfile
Après avoir réalisé que le problème initial était dû aux volumes en cours de montage après la construction du cotainer et donc à ne pas intégrer la base de données avec le fichier de vidage (ou exécuter des scripts dans ce répertoire) au démarrage, la deuxième solution consistait simplement à déplacer la directive volumes dans mon fichier de composition au-dessus de la directive construite. Cela a fonctionné et m'a permis de supprimer le script dump.sh et la directive DOCKERENTRY dans mon Dockerfile. Le docker-compose.yml modifié ressemble à ceci
#docker-compose.yml
version: '3'
services:
db:
volumes:
- ./configs/mysql/data:/docker-entrypoint-initdb.d
build: ./build/mysql/ #this is pointing to my Dockerfile
container_name: MYSQL_Database
restart: always
environment:
MYSQL_PORT: 3306
MYSQL_ROOT_PASSWORD: admin
MYSQL_DATABASE: my_app_database
MYSQL_USER: admin
MYSQL_PASSWORD: admin