我使用了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:
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 转储文件,但我在开头添加了两行内容,使得文件看起来像这样:
CREATE DATABASE IF NOT EXISTS `MYSQL_DATABASE`;
USE `MYSQL_DATABASE`;
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
命令在不同的容器中执行。这里有很好的解释:https://dev59.com/JWMm5IYBdhLWcg3wFL04 - KuhessRUN
带有多个步骤。您可以在此处找到一个软件的多步安装示例:https://dev59.com/G18e5IYBdhLWcg3wRY0k#25900207 - Kuhess