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容器启动时初始化Mysql数据库的文章就介绍到这了,更多相关docker容器启动初始化数据库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker启动mysql服务的实现步骤

    1:确保自己的服务器已经安装好了docker 输入 docker info 或者docker version 2:然后我们去docker hub去下载自己的想要的mysql镜像 找到offic的版本,点击进入 3:经命令放入linux中执行. [root@iZ2zehajf73atd9gbz1qdbZ redisconf]# docker pull mysql:5.6 4:然后检测自己是否下载成功:docker images 5:docker run --name some-mysql -d -

  • 如何让docker中的mysql启动时自动执行sql语句

    在用docker创建mysql容器的时,有时候我们期望容器启动后数据库和表已经自动建好,初始化数据也已自动录入,也就是说容器启动后我们就能直接连上容器中的数据库,使用其中的数据了. 其实mysql的官方镜像是支持这个能力的,在容器启动的时候自动执行指定的sql脚本或者shell脚本,我们一起来看看mysql官方镜像的Dockerfile,如下图: 已经设定了ENTRYPOINT,里面会调用/entrypoint.sh这个脚本,我们把mysql:8这个镜像pull到本地,再用docker run启

  • Docker启动mysql配置实现过程

    目录 实战过程 前言 可以通过官网查询其mysql如何启动 以及对mysql中的一些解读 附上官网地址 启动另一个mysql容器实例并运行mysql命令mysql是世界上最流行的开源数据库. 由于其经过验证的性能,可靠性和易用性,MySQL已经成为基于web的应用程序的领先数据库选择,涵盖了从个人项目和网站,通过电子商务和信息服务,一路到高知名度的web属性,包括Facebook, Twitter, YouTube, Yahoo! 和许多更多. 实战过程 通过查询官网具体白皮书 可得知使用这条命

  • Mac上使用Docker如何快速启动MySQL测试

    本文主要讨论使用Docker快速启动 MySQL 测试的方法,包括Mac环境.一起看看吧! 近来业界有很多对Docker的讨论,其生态系统发展得很快,然而,从简单的"入门"或"引导"类的文章中能容易地找到成熟的技术,但Docker不然.我在Mac上试玩过Docker,但Mac绝对是Docker界的二等公民.当我在Giuseppe的博客上看到关于在Mac上使用新Docker beta<Docker for Mac beta and MySQL>一文时,决定

  • docker中mysql初始化及启动失败问题解决方案

    最近做项目,遇到这样问题,docker 中的mysql 不能启动,经过上网查资料,终于解决了这个问题,这里记录下,也许还能帮助到大家, 在docker中有一个mysql服务,其数据文件是挂在在主机外面的文件,在docker中的root有访问该数据文件的权限,但是docker中mysql访问数据文件的时候提示权限不足,于是只有以root用户来启动mysql了. 数据初始化: mysql_install_db --user=root --explicit_defaults_for_timestamp

  • docker mysql启动时执行初始化sql

    1.拉取Mysql镜像 docker pull mysql:5.7 2.检查mysql镜像 docker inspect mysql:5.7 "Entrypoint": [ "docker-entrypoint.sh" ], 3.本地创建mysql外挂的目录 ##挂载到容器内/docker-entrypoint-initdb.d:MySQL启动时将执行 01_create_database.sql /root/mysql-5.7/init-data 01_creat

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

    1. 前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行.那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案. 第一种方案是在容器启动后手动导入,太low了不行.第二种在Spring Boot客户端连接Mysql容器时初始化数据库,你可以参考使用flyway进行数据库版本控制一文,但是这依赖客户端的能力.能不能做到Mysql容器启动时就自己初始化数据库呢?当然可以!今天就来演示一下.全部代码见文末. 2.

  • Docker容器迁移Oracle到MySQL的实现方法

    目录 ️ 1. 创建专用网络 ️ 2. Oracle 12C部署 2.1 镜像下载 2.2 容器创建 2.3 创建业务用户 2.4 监听启动 ️ 3. MySQL8部署 3.1 容器创建 3.2 参数设置 3.3 登陆MySQL ️ 4. kettle迁移Oracle到MySQL 4.1 部署kettle 4.2 Oracle端数据校验 4.3 迁移Oracle到MySQL 4.4 迁移后MySQL数据验证 前言 Kettle是开源的 [TEL] 工具,JVAV编写,可以运行在多个平台,使用时有

  • 一台linux主机启动多个MySQL数据库的方法

    今天来说下一台Linux主机如何启动4个MySQL数据库: 1.要确定你的机器上面已经安装MySQL,我的MySQL在/usr/loacl/ 下面: cd /usr/local/mysql-5.7.18/ ll 2.进入/usr/loacl/data文件夹(没有自行创建),在data下分别创建四个文件夹,如 : 3307 3308 3309 3310: mkdir data cd data mkdir 3307 mkdir 3308 mkdir 3309 mkdir 3310 3.在/usr/l

  • springboot 启动时初始化数据库的步骤

    问题描述 在spring-boot启动时,希望能执行相应的sql文件来初始化数据库. 使用配置文件初始化数据库 可以在spring-boot的配置文件application.yml中设置要初始化的sql文件.这是最简单的方法,只需要添加属性就可以实现. 首先设置spring.datasource.initialization-mode=always表示任何类型数据库都进行数据库初始化,默认情况下,spring-boot会自动加载data.sql或data-${platform}.sql文件来初始

  • 如何解决docker容器启动失败

    问题:电脑重启之后,docker里面的mysql容器重启不了,不知道是什么原因 上面的步骤:如果sudo docker start name 能重新启动,也就是输入:docker ps 能看到自己所需要的服务已经开启,那就不需要再进行下面的步骤了,如果刚好像上面那样,那就接着看下文: 解决办法:删除启动不了的容器,然后再重新运行镜像. 注意此时的容器名已经变为mysql了,为关闭状态,再运行镜像时还是运行不了,但此时再启动镜像时就可以启动了 内容补充 1.查看docker占用的挂载点 cat /

  • 详解Shell脚本控制docker容器启动顺序

    1.遇到的问题 在分布式项目部署的过程中,经常要求服务器重启之后,应用(包括数据库)能够自动恢复使用.虽然使用docker update --restart=always containerid能够让容器自动随docker启动,但是并不能保证是在数据库启动之后启动,如果数据库未启动,那么将导致应用启动失败;网上还有一种解决方法是通过docker-compose容器编排来控制启动顺序,这个博主研究的比较少. 2.解决思路 使用Shell脚本来控制,思路大致如下 探测数据库端口来检验数据库是否启动成

  • Linux 初始化MySQL 数据库报错解决办法

     Linux 初始化MySQL 数据库报错解决办法 在Linux   CentOS 5 中安装完MySQL (server.devel)之后进行初始化 service mysqld  start ,执行命令报错: Neither host 'localhost.localdomain' nor 'localhost' could be looked up with /usr/bin/resolveip Please configure the 'hostname' command to retu

  • Android 个人理财工具二:使用SQLite实现启动时初始化数据

       关于SQLite sqlite是嵌入式SQL数据库引擎SQLite(SQLite Embeddable SQL Database Engine)的一个扩展.SQLite是一个实现嵌入式SQL数据库引擎小型C语言库(C library),实现了独立的,可嵌入的,零配置的SQL数据库引擎.特性包括:事务操作是原子,一致,孤立,并且持久的,即使在系统崩溃和电源故障之后. 零配置--不需要安装和管理. 实现了绝大多数SQL92标准. 我在多年前就关注sqlite的发展,非常看好sqlite的前景,

  • SpringBoot 如何添加容器启动的初始化逻辑的操作方法

    背景 传统 SpringMVC 项目中,我们可以定义容器初始化 Servlet ,然后在 web.xml 配置该 Servlet ,指定 load-on-startup 就可以在容器启动后,执行一些系统的初始化逻辑.比如设置全局资源文件路径.加载系统定时任务.数据初始化等. 技术转换到 SpringBoot 的时候,该在哪里添加应用初始化的代码呢? 如果初始化逻辑中,有一些普通类,需要通过 Spring 的 ApplicationContext 的 getBean 获取依赖属性,如何保证 Spr

  • 解决docker容器启动后马上退出的问题

    最近在看docker如何让容器在启动时直接运行某些进程,后来发现Dockerfile可以在容器启动的时候指定容器运行命令. CMD指定,但是每个Dockerfile只能有一条CMD指令,如果指定了多条CMD指定,只有最后一条会被执行. 于是就想了一个办法,在写了一个脚本,在脚本里面启动多个进程,在Dockerfile里运行这个脚本. 最后证明这个方法是可行的,在实验过程中遇到一个问题,容器启动后会马上停止. 经查阅资料: Docker容器同时只能管理一个进程,如果这个进程退出那么容器也就退出了,

随机推荐