我使用了docker-entrypoint-initdb.d方法(感谢@Kuhess),但就我而言,我想基于在.env文件中定义的一些参数来创建数据库,所以我做了这些
1)首先,我在Docker根项目目录中定义类似以下的.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转储我的数据库并将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/…–