Docker容器启动时初始化Mysql数据库
2020-05-27 16:06:01来源:博客园 阅读 ()
Docker容器启动时初始化Mysql数据库
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
命令把第四步拷贝的文件夹下的所有.sql
文件复制到/docker-entrypoint-initdb.d
下,这样才能利用2.章节的机制进行初始化数据库。 - 第六步,删除使用过的临时目录。
然后你可以通过构建镜像命令构建自定义的Mysql镜像:
# 一定不要忘记最后的一个 . 点
docker build -t mysql:5.7c .
通过mysql:5.7c
镜像启动一个名称为mysql-service
的容器,root密码为123456
,并持久化数据到宿主机 D:/mysql/data
下:
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%'
查看时区是否是东八区。
4. 总结
今天我们自定义一个可以执行初始化数据库的Mysql镜像,方便我们进行部署。你也可以参考这个思路来定制其它一些自己需要的Docker镜像。本文的完整Demo可通过我个人博客获取。
关注公众号:Felordcn 获取更多资讯
个人博客:https://felord.cn
原文链接:https://www.cnblogs.com/felordcn/p/12970489.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
- Java笔记:集合 2020-06-10
- java环境教程:Tomcat下载,安装,设置为Windows服务,启动 2020-06-09
- SpringBoot通过web页面动态控制定时任务的启动、停止、创建 2020-06-09
- 详解SpringBoot(2.3)应用制作Docker镜像(官方方案) 2020-06-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash