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 数据库:
如果你的启动命令没有指定数据库那么就必须在数据库DDL脚本中声明并指定使用该数据库。否则就会实现下面的异常:
那么接下来我们将利用这一机制来实现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镜像:
通过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镜像。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-05-27
本文作者:码农小胖哥
本文来自:“掘金”,了解相关信息可以关注“掘金”

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
安防视频监控行业的“新基建”要如何落地?
“两会”期间, “新基建”(即新型基础设施建设)被频频提及,并且被首次写入《政府工作报告》,国家提出了对 "新基建" 的 2020 计划 ,具体指: 加强新型基础设施建设,发展新一代信息网络,拓展 5G 应用,建设充电桩,推广新能源汽车,激发新消费需求、助力产业升级。 作为“新基建”的重要内容,具有高速率、低时延、大带宽等特点的5G网络将迈入快速发展的新阶段。而随着5G网络的发展,一些相关行业也将随之出现变革。以视频监控行业为例: 首先,超高清视频时代到来 不断变化的市场需求使得视频图像逐步从标清、走向高清甚至超高清。5G网络技术的普及还将推进超高清视频的传输效率进一步提升,从而解决数据提取及进行分析应用时,因为图像的清晰度不够而无法使用的问题。 其次,智能化成为发展趋势。 人脸识别、行为识别、车牌识别、目标分类等人工智能算法的快速发展,使得安防智能化成为了近两年最为明显的一个发展趋势。 根据IDC的相关预测, AI摄像头将持续高速增长,并大量替换传统摄像头。智能视频监控技术近几年来被广泛研究并开始实际应用,通过将AI相关的视觉技术融入视频监控系统,可以对视频数据流进行图像处理、目标分...
- 下一篇
ES[7.6.x]学习笔记(十一)与SpringBoot结合
在前面的章节中,我们把ES的基本功能都给大家介绍完了,从ES的搭建、创建索引、分词器、到数据的查询,大家发现,我们都是通过ES的API去进行调用,那么,我们在项目当中怎么去使用ES呢?这一节,我们就看看ES如何与我们的SpringBoot项目结合。 版本依赖 SpringBoot默认是有ElasticSearch的Starter,但是它依赖的ES客户端的版本比较低,跟不上ES的更新速度,所以我们在SpringBoot项目中要指定ES的最新版本,如下: <properties> <elasticsearch.version>7.6.1</elasticsearch.version> </properties> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>...
相关文章
文章评论
共有0条评论来说两句吧...