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

1. 前言

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

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

2.原理

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

$ docker run --name some-mysql -e MYSQL_DATABASE=REGION_DB -d mysql:tag
复制代码

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

ERROR 1046 (3D000) at line 7: No database selected
复制代码

那么接下来咱们将利用这一机制来实现Docker容器启动时初始化数据库。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 命令把第四步拷贝的文件夹下的全部.sql文件复制到 /docker-entrypoint-initdb.d下,这样才能利用2.章节的机制进行初始化数据库。
  • 第六步,删除使用过的临时目录。

而后你能够经过构建镜像命令构建自定义的Mysql镜像:bash

# 必定不要忘记最后的一个 . 点
docker build -t mysql:5.7c .
复制代码

经过mysql:5.7c镜像启动一个名称为mysql-service的容器,root密码为123456,并持久化数据到宿主机 D:/mysql/data下:spring-boot

docker run --name mysql-service -v d:/mysql/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7c
复制代码

小贴士:你能够经过 SHOW VARIABLES LIKE 'character%' 查看字符集是否更改成utf8mb4,也能够经过SHOW VARIABLES LIKE '%time_zone%' 查看时区是不是东八区。ui

4. 总结

今天咱们自定义一个能够执行初始化数据库的Mysql镜像,方便咱们进行部署。你也能够参考这个思路来定制其它一些本身须要的Docker镜像。本文的完整Demo可经过我我的博客获取。编码

关注公众号:Felordcn获取更多资讯

我的博客:https://felord.cn

相关文章
相关标签/搜索