Ho usato l'approccio docker-entrypoint-initdb.d (Grazie a @Kuhess) Ma nel mio caso voglio creare il mio DB in base ad alcuni parametri che ho definito nel file .env quindi ho fatto questi
1) Per prima cosa definisco il file .env qualcosa di simile nella mia directory del progetto di root docker
MYSQL_DATABASE=my_db_name
MYSQL_USER=user_test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
MYSQL_PORT=3306
2) Quindi definisco il mio file docker-compose.yml. Quindi ho usato la direttiva args per definire le mie variabili di ambiente e le ho impostate dal file .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) Quindi definisco una cartella mysql che include un Dockerfile. Quindi il Dockerfile è questo
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) Ora uso mysqldump per scaricare il mio db e inserire data.sql nella cartella mysql
mysqldump -h <server name> -u<user> -p <db name> > data.sql
Il file è solo un normale file di dump sql ma aggiungo 2 righe all'inizio in modo che il file assomigli a questo
--
-- 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 ...;
...
...
...
Quindi quello che sta succedendo è che ho usato il comando "RUN sed -i 's / MYSQL_DATABASE /' $ MYSQL_DATABASE '/ g' /etc/mysql/data.sql" per sostituire il MYSQL_DATABASE
segnaposto con il nome del mio DB in cui l'ho impostato file .env.
|- docker-compose.yml
|- .env
|- mysql
|- Dockerfile
|- data.sql
Ora sei pronto per creare ed eseguire il tuo container
RUN
comando viene eseguito in un contenitore diverso. E 'ben spiegata qui: stackoverflow.com/questions/17891669/...