web-dev-qa-db-fra.com

Utiliser docker-compose pour créer un schéma/une base de données MySQL

J'essaie de créer une base de données/schéma mysql s'il n'existe pas déjà. 

Voici ce que j'ai essayé:

docker-compose.yml

mysql:
  image: mysql:5.6.26
  environment:
   - MYSQL_ROOT_PASSWORD=root
  command: "mysql -uroot -proot < createDB.sql"
  ports:
    - "3306:3306"

createDB.sql

CREATE DATABASE IF NOT EXISTS bignibou;

Ça ne marche pas. Quelle serait la meilleure façon d'utiliser docker/docker-compose afin de créer un schéma s'il n'existe pas?

17
balteo

J'ai enfin trouvé le début d'une solution. 

L’image MySQL utilise une variable d’environnement, c’est-à-dire MYSQL_DATABASE, qui initialise le conteneur avec le nom de la base de données au démarrage de l’image. Voir ici pour le détail documentation }.

Ou lisez l'extrait ci-dessous:

MYSQL_DATABASE

Cette variable est facultative et vous permet de spécifier le nom d'un base de données à créer au démarrage de l’image. Si un utilisateur/mot de passe était fourni (voir ci-dessous), cet utilisateur se verra accorder un accès superutilisateur (correspondant à GRANT ALL) à cette base de données.

Voici ce que je suis venu avec:

mysql:
  image: mysql:5.6.26
  environment:
   - MYSQL_ROOT_PASSWORD=root
   - MYSQL_DATABASE=bignibou
  ports:
    - "3306:3306"

J'ai maintenant besoin d'un moyen de spécifier le classement par défaut, mais c'est une autre histoire ...

edit: Pour ceux intéressés à spécifier un classement différent de celui par défaut, voici les instructions pour utiliser un autre fichier de configuration qui remplacera celui par défaut. Voir ci-dessous:

Utilisation d’un fichier de configuration MySQL personnalisé Démarrage de MySQL la configuration est spécifiée dans le fichier /etc/mysql/my.cnf, et que fichier inclut à son tour tous les fichiers contenus dans /etc/mysql/conf.d répertoire qui se termine par .cnf. Les réglages dans les fichiers de ce répertoire seront augmentez et/ou remplacez les paramètres dans /etc/mysql/my.cnf. Si tu veux Si vous utilisez une configuration MySQL personnalisée, vous pouvez créer votre alternative fichier de configuration dans un répertoire de la machine hôte, puis montez cet emplacement de répertoire sous la forme /etc/mysql/conf.d à l'intérieur de mysql récipient.

Si /my/custom/config-file.cnf est le chemin d'accès et le nom de votre fichier personnalisé Dans le fichier de configuration, vous pouvez démarrer votre conteneur mysql de la manière suivante (remarque Seul le chemin du répertoire du fichier de configuration personnalisé est utilisé dans cette commande ):

$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD = my-secret-pw -d mysql: tag Ceci démarrera un nouveau fichier conteneur some-mysql où l'instance MySQL utilise le combiné paramètres de démarrage de /etc/mysql/my.cnf et /etc/mysql/conf.d/config-file.cnf, avec les paramètres de ce dernier prendre la priorité.

23
balteo

Pour ne pas perdre vos données, utilisez mieux les volumes:

version: '3'
services:
  db:
    image: mysql:5.7
    volumes:
        - mysql-db:/var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: my_db_name
    ports:
        - "3307:3306"
volumes:
  mysql-db:
3
Codenator81

ce que vous essayez de faire nécessite probablement un script supplémentaire. Par conséquent, si vous avez la possibilité de créer une image au lieu d'utiliser directement une image prédéfinie, vous devez utiliser un fichier Docker et utiliser un fichier de script qui importe d'abord le script dans MySql, puis exécute le service.

jetez un oeil à cette réponse: Docker - Initialise la base de données mysql avec schema

1
mohamnag

Dans la documentation de docker-compose - voir Définition de services -, vous pouvez indiquer le fichier Docker à utiliser pour la création de l'image. Par conséquent, vous pouvez créer un fichier Dockerfile basé sur l'image mysql et créer la base de données qu'il contient à l'aide des commandes Dockerfile standard.

0
Grasshopper

Cela pourrait être utile au cas où quelqu'un atterrirait ici à l'avenir. Le vrai problème semble être l’instruction "command" du fichier docker-compose. Une fois la commande terminée avec succès, le conteneur sera détruit. Ce script SQL doit être exécuté uniquement après l'exécution de docker-compose et la création de conteneurs. docker-compose "commande" est vraiment de démarrer un service dans le conteneur. Dans ce cas, vous avez surchargé le service mysql avec votre commande.

0
Dean Sha