Docker容器启动时初始化Mysql数据库的方法

作者:码农小胖哥 时间:2024-01-19 12:16:36 

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 数据库:

$ 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 为例。不同的版本可能有一定的出入,需要详细去阅读官方文档。脚本如下:


FROM mysql:5.7
LABEL OG=felord.cn
COPY utf8mb4.cnf /etc/mysql/conf.d/utf8mb4.cnf
COPY ./sql /tmp/sql
RUN mv /tmp/sql/*.sql /docker-entrypoint-initdb.d
RUN 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. 总结

标签:docker,容器启动,初始化,数据库
0
投稿

猜你喜欢

  • Python学习之异常中的finally使用详解

    2021-09-08 02:21:38
  • 时间序列分析之ARIMA模型预测餐厅销量

    2023-07-09 13:53:59
  • 浅谈Python数据处理csv的应用小结

    2021-06-10 01:40:41
  • vue 中Virtual Dom被创建的方法

    2024-05-09 10:41:45
  • JS获取对象代码总结

    2011-03-07 16:14:00
  • Zend Studio去除编辑器的语法警告设置方法

    2023-10-11 17:10:15
  • Vue 页面监听用户预览时间功能的实现代码

    2024-04-27 15:56:25
  • numpy使用fromstring创建矩阵的实例

    2022-02-23 09:29:49
  • 浅谈Python类的__getitem__和__setitem__特殊方法

    2022-05-05 00:21:16
  • Python的SQLalchemy模块连接与操作MySQL的基础示例

    2024-01-20 07:37:13
  • Yahoo!网站性能最佳体验的34条黄金守则——图片、Coockie与移动应用

    2008-05-29 13:44:00
  • 一个基于flask的web应用诞生 bootstrap框架美化(3)

    2023-12-04 02:30:39
  • Python操作JSON文件的知识点整理

    2022-10-23 05:45:01
  • python实现一次创建多级目录的方法

    2021-10-20 11:37:31
  • 在Django的session中使用User对象的方法

    2022-04-23 01:20:07
  • TensorFlow安装并在Pycharm搭建环境的详细图文教程

    2023-09-12 16:34:00
  • python通过配置文件共享全局变量的实例

    2023-06-08 03:10:29
  • python多进程中的内存复制(实例讲解)

    2022-01-20 23:34:46
  • 设计性能更优MySQL数据库schema

    2024-01-28 22:22:49
  • 在mac下查找python包存放路径site-packages的实现方法

    2023-06-12 21:12:36
  • asp之家 网络编程 m.aspxhome.com