Docker-entrypoint-initdb.d yaklaşımını kullandım (@Kuhess sayesinde) Ama benim durumumda DB'mi .env dosyasında tanımladığım bazı parametrelere göre oluşturmak istiyorum, bu yüzden bunları yaptım
1) Öncelikle docker kök proje dizinimde .env dosyasını buna benzer bir şey tanımlıyorum
MYSQL_DATABASE=my_db_name
MYSQL_USER=user_test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
MYSQL_PORT=3306
2) Ardından docker-compose.yml dosyamı tanımlıyorum. Bu yüzden ortam değişkenlerimi tanımlamak için args direktifini kullandım ve onları .env dosyasından ayarladım
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) Daha sonra Dockerfile içeren bir mysql klasörü tanımlıyorum. Yani Dockerfile bu
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) Şimdi db'mi dökmek ve data.sql'yi mysql klasörüne koymak için mysqldump kullanıyorum
mysqldump -h <server name> -u<user> -p <db name> > data.sql
Dosya sadece normal bir sql dökümü dosyasıdır, ancak başlangıçta 2 satır ekliyorum, böylece dosya şöyle görünecektir
--
-- 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 ...;
...
...
...
Öyleyse, MYSQL_DATABASE
yer tutucuyu içinde ayarladığım DB'min adıyla değiştirmek için "RUN sed -i 's / MYSQL_DATABASE /' $ MYSQL_DATABASE '/ g' /etc/mysql/data.sql" komutunu kullandım .env dosyası.
|- docker-compose.yml
|- .env
|- mysql
|- Dockerfile
|- data.sql
Artık konteynerinizi oluşturmaya ve çalıştırmaya hazırsınız
RUN
komutun farklı bir kapta yürütülmesidir. Burada iyi açıklanmıştır: stackoverflow.com/questions/17891669/…