Usé el enfoque docker-entrypoint-initdb.d (Gracias a @Kuhess) Pero en mi caso quiero crear mi base de datos basada en algunos parámetros que definí en el archivo .env, así que hice estos
1) Primero defino el archivo .env como este en mi directorio de proyectos raíz de Docker
MYSQL_DATABASE=my_db_name
MYSQL_USER=user_test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
MYSQL_PORT=3306
2) Luego defino mi archivo docker-compose.yml. Entonces utilicé la directiva args para definir mis variables de entorno y las configuré desde el archivo .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) Luego defino una carpeta mysql que incluye un Dockerfile. Entonces el Dockerfile es este
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) Ahora uso mysqldump para volcar mi base de datos y poner data.sql dentro de la carpeta mysql
mysqldump -h <server name> -u<user> -p <db name> > data.sql
El archivo es solo un archivo de volcado sql normal pero agrego 2 líneas al principio para que el archivo se vea así
--
-- 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 ...;
...
...
...
Entonces, ¿qué sucede? Utilicé el comando "EJECUTAR sed -i / MYSQL_DATABASE / '$ MYSQL_DATABASE' / g '/etc/mysql/data.sql" para reemplazar el MYSQL_DATABASE
marcador de posición con el nombre de mi DB en el que lo configuré archivo .env.
|- docker-compose.yml
|- .env
|- mysql
|- Dockerfile
|- data.sql
Ahora está listo para construir y ejecutar su contenedor
RUN
comando se ejecuta en un contenedor diferente. Está bien explicado aquí: stackoverflow.com/questions/17891669/…