Tôi đã sử dụng cách tiếp cận docker-entrypoint-initdb.d (Cảm ơn @Kuhess) Nhưng trong trường hợp của tôi, tôi muốn tạo DB của mình dựa trên một số tham số tôi đã xác định trong tệp .env vì vậy tôi đã làm những điều này
1) Đầu tiên tôi định nghĩa tệp .env giống như thế này trong thư mục dự án gốc docker của tôi
MYSQL_DATABASE=my_db_name
MYSQL_USER=user_test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
MYSQL_PORT=3306
2) Sau đó, tôi xác định tệp docker-compose.yml. Vì vậy, tôi đã sử dụng chỉ thị args để xác định các biến môi trường của mình và tôi đặt chúng từ tệp .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) Sau đó, tôi xác định một thư mục mysql bao gồm Dockerfile. Vì vậy, Dockerfile là đây
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) Bây giờ tôi sử dụng mysqldump để kết xuất db của mình và đặt data.sql trong thư mục mysql
mysqldump -h <server name> -u<user> -p <db name> > data.sql
Tệp chỉ là một tệp kết xuất sql bình thường nhưng tôi thêm 2 dòng ở đầu để tệp sẽ trông như thế này
--
-- 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 ...;
...
...
...
Vì vậy, điều xảy ra là tôi đã sử dụng lệnh "RUN sed -i '/ MYSQL_DATABASE /' $ MYSQL_DATABASE '/ g' /etc/mysql/data.sql" để thay thế MYSQL_DATABASE
trình giữ chỗ bằng tên DB của tôi mà tôi đã đặt tập tin .env.
|- docker-compose.yml
|- .env
|- mysql
|- Dockerfile
|- data.sql
Bây giờ bạn đã sẵn sàng để xây dựng và chạy container của bạn
RUN
lệnh được thực thi trong một thùng chứa khác nhau. Nó cũng được giải thích ở đây: stackoverflow.com/questions/17891669/