J'ai utilisé l'approche docker-entrypoint-initdb.d (Merci à @Kuhess) Mais dans mon cas, je veux créer ma base de données en fonction de certains paramètres que j'ai définis dans le fichier .env, alors je l'ai fait
1) Tout d'abord, je définis le fichier .env quelque chose comme ça dans mon répertoire de projet racine docker
MYSQL_DATABASE=my_db_name
MYSQL_USER=user_test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
MYSQL_PORT=3306
2) Ensuite, je définis mon fichier docker-compose.yml. J'ai donc utilisé la directive args pour définir mes variables d'environnement et je les ai définies à partir du fichier .env
version: '2'
services:
### MySQL Container
mysql:
build:
context: ./mysql
args:
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
ports:
- "${MYSQL_PORT}:3306"
3) Ensuite, je définis un dossier mysql qui comprend un Dockerfile. Donc le Dockerfile est ceci
FROM mysql:5.7
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
4) Maintenant, j'utilise mysqldump pour vider ma base de données et mettre le data.sql dans le dossier mysql
mysqldump -h <server name> -u<user> -p <db name> > data.sql
Le fichier est juste un fichier de vidage sql normal mais j'ajoute 2 lignes au début pour que le fichier ressemble à ceci
--
-- Create a database using `MYSQL_DATABASE` placeholder
--
CREATE DATABASE IF NOT EXISTS `MYSQL_DATABASE`;
USE `MYSQL_DATABASE`;
-- Rest of queries
DROP TABLE IF EXISTS `x`;
CREATE TABLE `x` (..)
LOCK TABLES `x` WRITE;
INSERT INTO `x` VALUES ...;
...
...
...
Donc, ce qui se passe, c'est que j'ai utilisé la commande "RUN sed -i 's / MYSQL_DATABASE /' $ MYSQL_DATABASE '/ g' /etc/mysql/data.sql" pour remplacer l' MYSQL_DATABASE
espace réservé par le nom de ma base de données dans laquelle je l'ai défini fichier .env.
|- docker-compose.yml
|- .env
|- mysql
|- Dockerfile
|- data.sql
Vous êtes maintenant prêt à créer et exécuter votre conteneur
RUN
commande est exécutée dans un conteneur différent. C'est bien expliqué ici: stackoverflow.com/questions/17891669/…