linux怎么查看本机内存大小
391
2022-10-22
如何在Mysql的Docker容器启动时初始化数据库
1. 前言
Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行。那么怎么初始化 SQL脚本以及数据呢?
我这里有两个传统方案。第一种方案是在容器启动后手动导入,太 low 了不行。第二种在Spring Boot客户端连接Mysql容器时初始化数据库,你可以参考使用 flyway 进行数据库版本控制一文,但是这依赖客户端的能力。能不能做到Mysql容器启动时就自己初始化数据库呢?当然可以!今天就来演示一下。全部代码见文末。
2.原理
$ docker run --name some-mysql -e MYSQL_DATABASE=REGION_DB -d mysql:tag
ERROR 1046 (3D000) at line 7: No database selected
那么接下来我们将利用这一机制来实现Docker容器启动时初始化数据库。
3.自定义 Dockerfile
我们编写自己的Dockerfile来实现我们的需求,这里以 Mysql:5.7 为例。不同的版本可能有一定的出入,需要详细去阅读官方文档。脚本如下:
FROM mysql:5.7LABEL OG=felord.cnCOPY utf8mb4.cnf /etc/mysql/conf.d/utf8mb4.cnfCOPY ./sql /tmp/sqlRUN mv /tmp/sql/*.sql /docker-entrypoint-initdb.dRUN 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 utf8mb4 字符集和时区配置:
[mysqld]init_connect='SET NAMES utf8mb4'character-set-server=utf8mb4collation-server = utf8mb4_unicode_cidefault-time_zone = '+8:00'[mysql]default-character-set=utf8mb4[client]default-character-set=utf8mb4
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~