나는 docker-entrypoint-initdb.d 접근 방식을 사용했습니다 (@Kuhess에게 감사드립니다)하지만 제 경우에는 .env 파일에서 정의한 일부 매개 변수를 기반으로 DB를 만들고 싶습니다.
1) 먼저 도커 루트 프로젝트 디렉토리에 이와 같은 .env 파일을 정의합니다.
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) 그런 다음 Dockerfile을 포함하는 mysql 폴더를 정의합니다. 그래서 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를 사용하여 db를 덤프하고 data.sql을 mysql 폴더에 넣습니다.
mysqldump -h <server name> -u<user> -p <db name> > data.sql
파일은 일반적인 SQL 덤프 파일이지만 처음에 두 줄을 추가하여 파일이 다음과 같이 보일 것입니다.
--
-- 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
자리 표시자를 내가 설정 한 DB의 이름으로 대체 했습니다. .env 파일.
|- docker-compose.yml
|- .env
|- mysql
|- Dockerfile
|- data.sql
이제 컨테이너를 빌드하고 실행할 준비가되었습니다.
RUN
명령이 다른 컨테이너에서 실행되기 때문입니다. 여기에 잘 설명되어 있습니다 : stackoverflow.com/questions/17891669/…