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. 总结

今天我们自定义一个可以执行初始化数据库的Mysql镜像,方便我们进行部署。你也可以参考这个思路来定制其它一些自己需要的Docker镜像。本文的完整Demo可通过我个人博客获取。

关注微信公众号:Felordcn 获取更多干货

docker 容器启动顺序_Docker容器启动时初始化Mysql数据库相关推荐

  1. 安装MySql时初始化 MySQL 数据库失败的几个总结

    初始化 MySQL 数据库: Neither host 'localhost.localdomain' nor 'localhost' could be looked up with /usr/bin ...

  2. STL 容器简介:C++ 容器:顺序性容器、关联式容器和容器适配器

    STL标准容器类简介 标准容器类 说明 顺序性容器 vector 从后面快速的插入与删除,直接访问任何元素 deque 从前面或后面快速的插入与删除,直接访问任何元素 list 双链表,从任何地方快速 ...

  3. php导入excel先检查,php 如何在导入Excel数据时检查Mysql数据库内容是否存在,避免重复录入?:怎么样筛选excel表格重复的数据库...

    php 如何在导入Excel数据时检查Mysql数据库内容是否存在,避免重复录入? 如果不想每询一次以提前做一个统询 $sql=mysql_query("select distinct Co ...

  4. docker删除none镜像_Docker容器相关命令

    1.新建并启动容器 使用以下docker run命令即可新建并启动一个容器,该命令是最常用的命令,它有很多选项,下面将列举一些常用的选项. -d选项:表示后台运行 -P选项:随机端口映射 -p选项:指 ...

  5. docker web程序本地化_Docker 容器化部署 Python 应用

    点击上方"Python数据科学",星标公众号 重磅干货,第一时间送达☞满600减350,当当这波羊毛我撸定了!♚作者:jerry,爬虫/数据分析/Web.Blog: http:// ...

  6. docker registry push 覆盖_docker容器和镜像操作 - 恋恋风辰

    基于本地模板导入镜像 假如本地有一个ubuntu系统模板压缩包, 可以通过import导入生成新的镜像 cat ubuntu-18.04.tar.gz | docker import - ubuntu ...

  7. docker 添加端口映射_Docker容器修改端口映射

    对于已经建立的docker容器,需要新增容器对主机的端口映射,主要分为三种: 一:通过修改配置文件修改docker容器端口映射 1.使用docker ps -a命令找到要修改容器的CONTAINER ...

  8. tomcat mysql 启动顺序_linux 上配置tomcat、mysql 开机启动

    1.tomcat 开机启动 方法一.修改系统文件 (已经尝试,可以) 1.修改/etc/rc.d/rc.local vi /etc/rc.d/rc.local 2.添加下面两行脚本,记住是两行,仅仅第 ...

  9. 容器created状态_docker容器状态的转换实现

    一 docker容器状态转换图 二 实战 [root@localhost ~]# docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 I ...

最新文章

  1. Linux监控工具dstat
  2. 几种常见的JVM调优场景(建议收藏)
  3. VoIP应用系统大盘点
  4. js简单的条件语句判断
  5. Linux记录-CPU指标介绍
  6. 结合使用 Draft 与 Tencent Kubernetes Engine (TKE)
  7. 【css】CSS中折叠margin的问题
  8. 蓝桥杯第六届国赛JAVA真题----密文搜索
  9. RPC和REST区别
  10. 私有云办公平台大规模集群/企业级集群/小型工作室集群解决方案:NextCloud集群部署方案--NextCloud集群架构设计
  11. 8 stark组件 展示数据
  12. java 实现不同用户编辑 word 文档的不同区域
  13. 电脑开机出现奇怪字符_电脑开机出现Reboot and select proper boot device几种解决措施...
  14. python画图turtle小人_python海龟绘图怎么增加每次画圆的半径|海龟python做图教程...
  15. Protostuff序列化和反序列化
  16. 剑指offer——面试题47:不用加减乘除做加法
  17. 分享爬取链家地图找房房价数据的小爬虫
  18. 长沙社区团购独角兽《兴盛优选》 18k 面试题记录,已拿offer!
  19. pythontrun什么意思_python 新手笔记一
  20. 网络与信息安全顶级期刊与会议

热门文章

  1. js ajax java传参_ajax参数传递与后台接收
  2. Asp.net 批量导入Excel用户数据功能加强版
  3. 子窗体菜单合并到父窗体菜单的解决办法
  4. Android之部分手机(oppo r9s)安装app出现崩溃问题解决办法
  5. 如何快速学习freemarker以及使用经验
  6. sklearn 线性回归_使用sklearn库做线性回归拟合
  7. 你以后会不会有小三?
  8. 这6部超经典的物理电影,居然还有人没有看过?
  9. 宫崎骏动画里的新垣结衣见过没?简直美呆!
  10. 据说这是史上最牛逼的可视化神器