Saya menggunakan pendekatan docker-entrypoint-initdb.d (Terima kasih kepada @Kuhess) Tetapi dalam kasus saya, saya ingin membuat DB saya berdasarkan beberapa parameter yang saya tentukan dalam file .env jadi saya melakukan ini
1) Pertama saya mendefinisikan file .env seperti ini di direktori proyek root docker saya
MYSQL_DATABASE=my_db_name
MYSQL_USER=user_test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
MYSQL_PORT=3306
2) Kemudian saya mendefinisikan file docker-compose.yml saya. Jadi saya menggunakan arahan args untuk mendefinisikan variabel lingkungan saya dan saya mengaturnya dari 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) Lalu saya mendefinisikan folder mysql yang menyertakan Dockerfile. Jadi Dockerfile adalah ini
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) Sekarang saya menggunakan mysqldump untuk membuang db saya dan meletakkan data.sql di dalam folder mysql
mysqldump -h <server name> -u<user> -p <db name> > data.sql
File ini hanya file dump sql biasa tetapi saya menambahkan 2 baris di awal sehingga file akan terlihat seperti ini
--
-- 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 ...;
...
...
...
Jadi yang terjadi adalah saya menggunakan perintah "RUN sed -i 's / MYSQL_DATABASE /' $ MYSQL_DATABASE '/ g' /etc/mysql/data.sql" untuk mengganti MYSQL_DATABASE
placeholder dengan nama DB saya yang telah saya setel di dalamnya file .env.
|- docker-compose.yml
|- .env
|- mysql
|- Dockerfile
|- data.sql
Sekarang Anda siap untuk membangun dan menjalankan penampung Anda
RUN
perintah dieksekusi dalam wadah yang berbeda. Ini dijelaskan dengan baik di sini: stackoverflow.com/questions/17891669/…