Docker容器启动时初始化Mysql数据库的方法

2020-06-17 07:30:31易采站长站整理

1. 前言

Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行。那么怎么初始化 SQL脚本以及数据呢?

我这里有两个传统方案。 第一种方案是在容器启动后手动导入,太low了不行。第二种在Spring Boot客户端连接Mysql容器时初始化数据库,你可以参考使用flyway进行数据库版本控制一文,但是这依赖客户端的能力。能不能做到Mysql容器启动时就自己初始化数据库呢?当然可以!今天就来演示一下。全部代码见文末。

2.原理

当Mysql容器首次启动时,会在

/docker-entrypoint-initdb.d
目录下扫描
.sh
.sql
.sql.gz
类型的文件。如果这些类型的文件存在,将执行它们来初始化一个数据库。这些文件会按照字母的顺序执行。默认情况下它们会初始化在启动容器时声明的
MYSQL_DATABASE
变量定义的数据库中,例如下面的命令会初始化一个
REGION_DB
数据库:

$ docker run –name some-mysql -e MYSQL_DATABASE=REGION_DB -d mysql:tag

如果你的启动命令没有指定数据库那么就必须在数据库DDL脚本中声明并指定使用该数据库。否则就会实现下面的异常:

ERROR 1046 (3D000) at line 7: No database selected

那么接下来我们将利用这一机制来实现Docker容器启动时初始化数据库。

3.自定义Dockerfile

我们编写自己的Dockerfile来实现我们的需求,这里以 Mysql:5.7 为例。不同的版本可能有一定的出入,需要详细去阅读官方文档。脚本如下:


FROM mysql:5.7
LABEL OG=felord.cn
COPY utf8mb4.cnf /etc/mysql/conf.d/utf8mb4.cnf
COPY ./sql /tmp/sql
RUN mv /tmp/sql/*.sql /docker-entrypoint-initdb.d
RUN rm -rf /tmp/sql

第一步,引入官方 Mysql:5.7 Docker镜像。
第二步,无实际意义,主要是作者、组织信息。
第三步,很重要!本来我没有配置第三行,结果运行容器后发现初始化数据的中文全部乱码了。所以需要在初始化数据库前修改Mysql的编码等配置,这里我顺便把时区也改为了

+8:00
。第四步,复制包含数据库脚本的
./sql
文件夹到镜像的
/tmp/sql
下。
第五步,使用
mv
命令把第四步拷贝的文件夹下的所有