【每日一记8】+第7天+Docker容器启动时初始化MySQL数据库
  

简单思考 1402

{{ttag.title}}
我这里有两个传统方案。 第一种方案是在容器启动后手动导入,太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  为例。不同的版本可能有一定的出入,需要详细去阅读官方文档。脚本如下:


  • 第一步,引入官方 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镜像。

打赏鼓励作者,期待更多好文!

打赏
暂无人打赏

新手612152 发表于 2020-6-18 10:06
  

谢谢楼主分享。
JM 发表于 2020-6-18 11:06
  
感谢分享
新手780102 发表于 2020-6-18 11:14
  
感谢分享
司马缸砸了光 发表于 2020-6-18 11:23
  
感谢分享
新手978513 发表于 2020-6-18 11:33
  
谢谢楼主分享。
新手517842 发表于 2020-6-18 11:43
  
感谢分享
新手031815 发表于 2020-6-18 12:31
  
感谢分享
新手899116 发表于 2020-6-18 14:03
  
谢谢楼主分享。
新手741261 发表于 2020-6-18 14:18
  
感谢分享
发表新帖
热门标签
全部标签>
每日一问
2024年技术争霸赛
技术盲盒
技术笔记
每周精选
安装部署配置
产品连连看
2023技术争霸赛专题
干货满满
技术咨询
信服课堂视频
标准化排查
秒懂零信任
技术晨报
自助服务平台操作指引
运维工具
文档捉虫活动
新版本体验
功能体验
功能咨询
通用技术
GIF动图学习
问题分析处理
每日一记
SDP百科
排障笔记本
畅聊IT
答题自测
专家问答
技术圆桌
测试报告
用户认证
解决方案
VPN 对接
项目案例
地址转换
存储
技术争霸赛
卧龙计划
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
日志审计
流量管理
云计算知识
原创分享
sangfor周刊
SANGFOR资讯
专家分享
技术顾问
信服故事
终端接入
授权
设备维护
资源访问
虚拟机
迁移
加速技术
产品预警公告
玩转零信任
信服圈儿
S豆商城资讯
「智能机器人」
追光者计划
深信服技术支持平台
社区帮助指南
答题榜单公布
纪元平台
华北区拉练
天逸直播
以战代练
山东区技术晨报
齐鲁TV
华北区交付直播
北京区每日一练

本版达人

adds

本周建议达人

无极剑圣

本周分享达人

新手25642...

本周提问达人