如何在Mysql的Docker容器启动时初始化数据库

网友投稿 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小时内删除侵权内容。

上一篇:Docker下安装memcached
下一篇:Java十分钟掌握数组与常见异常
相关文章

 发表评论

暂时没有评论,来抢沙发吧~