ฉันใช้วิธี docker-entrypoint-initdb.d (ขอบคุณ @Kuhess) แต่ในกรณีของฉันฉันต้องการสร้างฐานข้อมูลของฉันตามพารามิเตอร์บางอย่างที่ฉันกำหนดไว้ในไฟล์. env ดังนั้นฉันจึงทำสิ่งเหล่านี้
1)ก่อนอื่นฉันกำหนดไฟล์. env บางอย่างเช่นนี้ในไดเร็กทอรีโปรเจ็กต์ root ของนักเทียบท่า
MYSQL_DATABASE=my_db_name
MYSQL_USER=user_test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
MYSQL_PORT=3306
2)จากนั้นฉันกำหนดไฟล์ docker-compose.yml ของฉัน ดังนั้นฉันจึงใช้คำสั่ง args เพื่อกำหนดตัวแปรสภาพแวดล้อมของฉันและฉันตั้งค่าจากไฟล์. 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)จากนั้นฉันกำหนดโฟลเดอร์ mysql ที่มี Dockerfile Dockerfile ก็คือนี่
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)ตอนนี้ฉันใช้ mysqldump เพื่อถ่ายโอนข้อมูลฐานข้อมูลของฉันและวาง data.sql ไว้ในโฟลเดอร์ mysql
mysqldump -h <server name> -u<user> -p <db name> > data.sql
ไฟล์นี้เป็นเพียงไฟล์ดัมพ์ sql ธรรมดา แต่ฉันเพิ่ม 2 บรรทัดที่จุดเริ่มต้นดังนั้นไฟล์จะมีลักษณะดังนี้
--
-- 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 ...;
...
...
...
สิ่งที่เกิดขึ้นคือฉันใช้คำสั่ง "RUN sed -i 's / MYSQL_DATABASE /' $ MYSQL_DATABASE '/ g' /etc/mysql/data.sql เพื่อแทนที่MYSQL_DATABASE
ตัวยึดตำแหน่งด้วยชื่อฐานข้อมูลของฉันที่ฉันตั้งไว้ .env ไฟล์
|- docker-compose.yml
|- .env
|- mysql
|- Dockerfile
|- data.sql
ตอนนี้คุณพร้อมที่จะสร้างและเรียกใช้คอนเทนเนอร์ของคุณแล้ว
RUN
คำสั่งดำเนินการในคอนเทนเนอร์ที่แตกต่างกัน มีการอธิบายไว้อย่างดีที่นี่: stackoverflow.com/questions/17891669/…