J'essaie de créer un conteneur avec une base de données MySQL et d'ajouter un schéma à ces bases de données.
Mon Dockerfile actuel est:
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
COPY files/epcis_schema.sql /data/epcis_schema.sql
# Change the working directory
WORKDIR data
CMD mysql -u $MYSQL_USER -p $MYSQL_PASSWORD $MYSQL_DATABASE < epcis_schema.sql
Afin de créer le conteneur, je suis la documentation fournie sur Docker et j'exécute cette commande:
docker run --name ${CONTAINER_NAME} -e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} -e MYSQL_USER=${DB_USER} -e MYSQL_PASSWORD=${DB_USER_PASSWORD} -e MYSQL_DATABASE=${DB_NAME} -d mvpgomes/epcisdb
Mais lorsque j'exécute cette commande, le conteneur n'est pas créé et dans l'état du conteneur, il est possible de voir que le CMD n'a pas été exécuté avec succès, en fait seule la mysql
commande est exécutée.
Quoi qu'il en soit, existe-t-il un moyen d'initialiser la base de données avec le schéma ou dois-je effectuer ces opérations manuellement?
mysql
docker
database-schema
Marcus Gomes
la source
la source
Réponses:
Je suis désolé pour cette réponse très longue, mais vous avez un petit chemin à parcourir pour arriver là où vous le souhaitez. Je dirai que normalement, vous ne mettriez pas le stockage de la base de données dans le même conteneur que la base de données elle-même, vous monteriez soit un volume hôte afin que les données persistent sur l'hôte docker, soit un conteneur pourrait peut-être être utilisé pour contenir les données (/ var / lib / mysql). De plus, je suis nouveau sur mysql, donc ce n'est peut-être pas très efficace. Cela dit...
Je pense qu'il y a peut-être quelques problèmes ici. Le Dockerfile est utilisé pour créer une image. Vous devez exécuter l'étape de construction. Au minimum, à partir du répertoire qui contient le Dockerfile, vous feriez quelque chose comme:
Le Dockerfile décrit l'image à créer. Je ne sais pas grand-chose sur mysql (je suis un fanboy postgres), mais j'ai fait une recherche autour des interwebs pour savoir «comment initialiser un conteneur de docker mysql». J'ai d'abord créé un nouveau répertoire dans lequel travailler, je l'ai appelé mdir, puis j'ai créé un répertoire de fichiers dans lequel j'ai déposé un fichier epcis_schema.sql qui crée une base de données et une seule table:
Ensuite, j'ai créé un script appelé init_db dans le répertoire des fichiers:
(la plupart de ce script a été levé d'ici: https://gist.github.com/pda/9697520 )
Voici le script files / run_db que j'ai créé:
Enfin, le Dockerfile pour les lier tous:
Donc, je suis entré dans mon répertoire mdir (qui contient le Dockerfile avec le répertoire des fichiers). J'exécute ensuite la commande:
Vous devriez voir une sortie comme celle-ci:
Vous avez maintenant une image '7f6d5215fe8d'. Je pourrais exécuter cette image:
et l'image commence, je vois une chaîne d'instance:
Je pourrais alors «l'arrêter» et le redémarrer.
Si vous regardez les journaux, la première ligne contiendra:
Puis, à la fin des logs:
Ce sont les messages du script / tmp / run_db, le premier indique que la base de données a été décompressée à partir de la version enregistrée (initiale), le second indique que la base de données était déjà là, donc la copie existante a été utilisée.
Voici un ls -lR de la structure de répertoires que je décris ci-dessus. Notez que init_db et run_db sont des scripts avec le bit d'exécution défini:
la source
init_db
script.RUN
commande et le problème est apparemment résolu. Mais quand j'exécute,docker run
j'ai le même problème avec lerun_db
script.J'ai eu ce même problème lorsque je voulais initialiser le schéma de mon instance MySQL Docker, mais j'ai rencontré des difficultés pour le faire fonctionner après avoir fait quelques recherches sur Google et suivi des exemples d'autres. Voici comment je l'ai résolu.
1) Sauvegardez votre schéma MySQL dans un fichier.
2) Utilisez la commande ADD pour ajouter votre fichier de schéma au
/docker-entrypoint-initdb.d
répertoire dans le conteneur Docker. Ledocker-entrypoint.sh
fichier exécutera tous les fichiers de ce répertoire se terminant par".sql"
la base de données MySQL.Dockerfile:
3) Démarrez l'instance Docker MySQL.
Merci à la configuration de MySQL et à l'importation de dump dans Dockerfile pour m'avoir donné des indices sur le docker-entrypoint.sh et le fait qu'il exécute à la fois des scripts SQL et shell!
la source
schema.sql
? Je veux que ma base de données soit mise à jour en conséquence. Que se passe-t-il également lorsque je crée ce conteneur une deuxième fois? La base de données sera-t-elle détruite et créée à nouveau?Une autre méthode basée sur une fusion de réponses serveur ici avant:
fichier docker-compose:
où
/home/user
.. est un dossier partagé sur l'hôteEt dans le
/home/user/db/mysql/init
dossier .. déposez simplement un fichier sql, avec n'importe quel nom,init.sql
contenant par exemple :Selon la documentation officielle de mysql , vous pouvez mettre plus d'un fichier sql dans le
docker-entrypoint-initdb.d
, ils sont exécutés dans l'ordre alphabétiquela source
L'autre manière simple, utilisez docker-compose avec les lignes suivantes:
Placez votre schéma de base de données dans le ./database/install_db.sql. Chaque fois que vous construisez votre conteneur, le fichier install_db.sql sera exécuté.
la source
J'ai essayé la réponse de Greg sans succès, j'ai dû faire quelque chose de mal car ma base de données ne contenait aucune donnée après toutes les étapes: j'utilisais la dernière image de MariaDB, juste au cas où.
Ensuite, j'ai décidé de lire le point d'entrée de l' image officielle MariaDB et de l'utiliser pour générer un simple fichier docker-compose :
Maintenant, je suis capable de conserver mes données ET de générer une base de données avec mon propre schéma!
la source
Après le 4 août 2015, si vous utilisez l'image officielle de mysql Docker, vous pouvez simplement AJOUTER / COPIER un fichier dans le répertoire /docker-entrypoint-initdb.d/ et il fonctionnera avec le conteneur initialisé. Voir github: https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225 si vous souhaitez l'implémenter sur d'autres images de conteneurs
la source
La solution la plus simple est d'utiliser tutum / mysql
Étape 1
Étape 2
Étape 3
Obtenez au-dessus de CONTAINER_ID, puis exécutez la commande
docker logs
pour voir les informations de mot de passe générées.la source
tutum/mysql:5.5
et ça a réussi.docker run -d -p 3306:3306 -v /tmp:/tmp -e MYSQL_PASS="admin" -e STARTUP_SQL="/tmp/mysqldump.mysql" tutum/mysql:5.5
. Vous pouvez toujours exécuter la commandedocker logs CONTAINER_ID
pour voir les messages d'erreur si vous rencontrez des problèmes./tmp/to_be_imported.mysql
. est-ce un chemin sur le système d'exploitation hôte? où est unCOPY
ouADD
pour mettre des choses sur le système de fichiers du conteneur?COPY
/ADD
car le répertoire hôte / tmp est monté sur / tmp du conteneur. Regardez attentivement la commande, il y a la pièce-v /tmp:/tmp
. Personnellement, je ne monterais pas un volume simplement pour rendre le fichier disponible dans le conteneur, mais je suppose que c'est un choix personnel.Pour ceux qui ne veulent pas créer un script de point d'entrée comme moi, vous pouvez en fait démarrer mysqld au moment de la construction, puis exécuter les commandes mysql dans votre Dockerfile comme ceci:
La clé ici est d'envoyer mysqld_safe en arrière-plan avec le
&
signe unique .la source
Voici le Dockerfile que j'ai utilisé avec succès pour installer xampp, créer un MariaDB avec un schéma et pré-rempli avec les informations utilisées sur le serveur local (utilisateurs, commandes de photos, etc.)
la source
Après avoir lutté un peu avec cela, jetez un œil au Dockerfile en utilisant des volumes nommés (db-data). Il est important de déclarer un plus à la dernière partie, où j'ai mentionné que le volume est
[external]
Tout a très bien fonctionné de cette façon!
la source