日出 发表于 2024-2-24 19:31
  
谢谢分享,有助于工作。
德德 发表于 2024-2-24 19:31
  
谢谢分享,有助于工作。
焱燚 发表于 2024-2-24 19:36
  
谢谢分享,有助于工作。
小西北 发表于 2024-2-24 19:36
  
谢谢分享,有助于工作。
小霞米 发表于 2024-2-24 19:41
  
谢谢分享,有助于工作。
taoyb 发表于 2024-2-24 19:41
  
谢谢分享,有助于工作。
【每日一记8】+第7天+Docker容器启动时初始化MySQL数据库
  

简单思考 1463

{{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镜像。

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

打赏
暂无人打赏

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

本版达人

adds

本周建议达人

无极剑圣

本周分享达人

新手25642...

本周提问达人