web-dev-qa-db-fra.com

Créer une base de données au démarrage de docker-compose

J'aimerais créer une base de données MySQL en utilisant des variables d'environnement dans le fichier docker-compose.yml, mais cela ne fonctionne pas. J'ai le code suivant:

# The Database
database:
  image: mysql:5.7
  volumes:
    - dbdata:/var/lib/mysql
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: Homestead
    MYSQL_USER: root
    MYSQL_PASSWORD: secret
  ports:
    - "33061:3306"

Quelqu'un pourrait-il expliquer la fonction de ces vars?

20
Pedrog

Il existe également une option pour fournir un fichier d'initialisation pour le conteneur mysql qui sera appliqué à chaque création d'un conteneur.

database:
    image: mysql:5.7
    ports:
        - "33061:3306"
    command: --init-file /data/application/init.sql
    volumes:
        - ./init.sql:/data/application/init.sql
    environment:
        MYSQL_ROOT_USER: root
        MYSQL_ROOT_PASSWORD: secret
        MYSQL_DATABASE: Homestead
        MYSQL_USER: root
        MYSQL_PASSWORD: secret

Ce fichier peut contenir votre structure de base de données initiale et vos données - par exemple:

CREATE DATABASE IF NOT EXISTS dev;
CREATE DATABASE IF NOT EXISTS test;
USE dev;
CREATE TABLE IF NOT EXISTS (...);
32
marszczybrew

La base de données est probablement déjà initialisée et la configuration est stockée dans /var/lib/mysql. Puisque vous avez défini un volume pour cet emplacement, la configuration survivra à un redémarrage. L'image MySQL ne reconfigurera pas la base de données encore et encore, elle ne le fait qu'une fois.

volumes: - dbdata:/var/lib/mysql

Si votre base de données est vide, vous pouvez la réinitialiser en effectuant docker-compose down -v où le -v supprime les volumes définis dans la section des volumes. Voir https://docs.docker.com/compose/reference/down/ . Au prochain docker-compose up l’image MySQL va tout recommencer et initialiser la base de données avec la configuration que vous avez fournie dans la section environnement.

18
Sebastiaan Renkens

Répondre à ta question ...

Lorsque je construis un nouveau conteneur Docker, j’ai l'habitude de comprendre en quoi consiste l'image que je tire quand elle est construite.

Dans ton docker-compose.yml tu as ceci

# The Database
database:
  image: mysql:5.7

Ceci est l'image que vous tirez, "mysql: 5.7"

Dockerhub est un référentiel où vous pouvez trouver des informations sur ces images.

Effectuer une recherche google "mysql: 5.7 dockerhub"

Le premier résultat est https://hub.docker.com/_/mysql/

Là vous avez votre image 5.7, si vous cliquez sur 5.7 vous avez ceci

https://github.com/docker-library/mysql/blob/607b2a65aa76adf495730b9f7e28f146a9f95f/5.7/Dockerfile

Quel est le fichier Docker de l’image, vous pouvez jeter un coup d’œil aux choses intéressantes qui se produisent lors de la création de l’image.

ENTRYPOINT ["docker-entrypoint.sh"] est l'un de ceux-ci.

Ceci est le fichier qui a été exécuté lorsque l'image est prête

Si vous montez d'un niveau dans le dépôt, vous verrez ce fichier

https://github.com/docker-library/mysql/tree/607b2a65aa76adf495730b9f7e6f28f146a9f95f/5.7

Vous pouvez voir les variables d’environnement utilisées pour créer une nouvelle base de données, etc.

file_env 'MYSQL_DATABASE'
        if [ "$MYSQL_DATABASE" ]; then
            echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
            mysql+=( "$MYSQL_DATABASE" )
fi
8
jonhid

Pour la version 2 de docker-compos, vous allez .yml ou .yaml peut ressembler à ceci:

version: '2'
volumes:
 dbdata:

services:
 mysql:
  image: mysql:5.7
  container_name: mysql
  volumes:
    - dbdata:/var/lib/mysql
  restart: always
  environment:
    - MYSQL_ROOT_PASSWORD=secret
    - MYSQL_DATABASE=Homestead
    - MYSQL_USER=root
    - MYSQL_PASSWORD=secret
  ports:
    - "33061:3306"

commencez avec docker-compose up -d et vérifie:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
a3567fb78d0d        mysql:5.7           "docker-entrypoint..."   2 minutes ago       Up 2 minutes        0.0.0.0:33061->3306/tcp   mysql

docker exec -it a3567fb78d0d bash
root@a3567fb78d0d:/# mysql -u root -p Homestead
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Homestead          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

Votre volume sera conservé dans le volume du menu fixe nameoffolder_dbdata (/var/lib/docker/volumes/...)

7
lvthillo

Si je comprends bien votre question, vous souhaitez inclure un conteneur contenant une base de données spécifique. Comme avoir un conteneur MySQL avec CREATE DATABASE mydb, etc. déjà exécuté. Si c'est le cas, vous devez utiliser docker-entrypoint-initdb.d: https://docs.docker.com/samples/library/mysql/#docker-secrets

Lorsque le conteneur MySQL officiel est lancé pour la première fois, une nouvelle base de données est créée en premier. Ensuite, il exécutera les fichiers avec les extensions .sh, .sql et .sql.gz qui se trouvent dans /docker-entrypoint-initdb.d. Il suffit donc de créer /docker-entrypoint-initdb.d et placez votre script d’initialisation ici.

6
Gene S