MySQL启动时自动创建数据库
一、背景及分析
MysqL容器启动时,会自动创建一些必要的数据库,比如MysqL,这是官方默认的做法。但是,在实际中,还需要让MysqL自动创建我们自定义的数据库。本文就此应用场合进行探究。
一般的做法是,启动容器并挂载数据目录后,使用MysqL客户端连接服务器,再手动输入sql语句创建(或导入.sql文件),当然也可以直接在容器内创建(方法同上)。由于挂载了数据目录,因此可持久化保存。但是,这些方法在部署数据库比较繁琐,不方便,特别是在初测阶段,会频繁地从头开始搭建环境。
如果能在MysqL容器启动时,自动执行我们自己的.sql文件,就不需要那么麻烦了,其实MysqL容器的启动脚本已经考虑了这种场合。通过MysqL镜像构建脚本docker-entrypoint.sh(参考这里
),发现如下语句:
for f in /docker-entrypoint-initdb.d/*; doprocess_init_file "$f" "${MysqL[@]}"done
process_init_file函数定义如下:
process_init_file() {local f="$1"; shiftlocal MysqL=( "$@" )case "$f" in*.sh) echo "$0: running $f"; . "$f" ;;*.sql) echo "$0: running $f"; "${MysqL[@]}" < "$f"; echo ;;*.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${MysqL[@]}"; echo ;;*) echo "$0: ignoring $f" ;;esacecho}
从上面语句看到,脚本将需要执行的文件(如.sh或.sql)放到/docker-entrypoint-initdb.d目录下,那么docker-entrypoint.sh就会自动执行。明白了原理,解决方案就十分简单了。
二、解决方案
2.1 Dockerfile
内容如下:
为了方便起见,所有.sql文件都放到Dockerfile同级的sql目录。
2.2 准备好sql文件
下面是测试用的.sql文件,文件名为test.sql,内容如下:
-- 创建db_test数据库create database `db_test` default character set utf8 collate utf8_general_ci;use db_test;-- 创建用户表DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` bigint(20) NOT NULL,`email` varchar(255) DEFAULT NULL,`first_name` varchar(255) DEFAULT NULL,`last_name` varchar(255) DEFAULT NULL,`username` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;-- 插入数据INSERT INTO `user` (`id`, `email`, `first_name`, `last_name`, `username`)VALUES(0,'li@latelee.org','Late','Lee','latelee');
主要内容是创建user表,并插入测试的数据。
2.3 创建镜像
docker build -t MysqLtest .
创建镜像名称为MysqLtest,注意最后的点号.,表示使用当前目录的Dockerfile。
2.4 容器启动
version: '2'services:database:image: MysqLtest#image: singula/MysqLcontainer_name: MysqLports:- "3406:3306"volumes:- ./MysqL_data:/var/lib/MysqL- /home:/homeenvironment:MysqL_ROOT_PASSWORD: 123456
使用下列命令启动:
docker-compose up -d
验证数据库表:
$ docker exec -it MysqL bashbash-4.2# MysqL -uroot -p123456MysqL> use db_test;MysqL> select * from user;+----+----------------+------------+-----------+----------+| id | email | first_name | last_name | username |+----+----------------+------------+-----------+----------+| 0 | li@latelee.org | Late | Lee | latelee |+----+----------------+------------+-----------+----------+1 row in set (0.00 sec)
使用如下语句修改邮箱地址:
update user set email='cst@cststudio.com.cn' where username='latelee';
退出容器后,停止容器:
docker-compose down
再次重复上述命令启动、查看数据,可以看到邮件地址是最新的,从而验证了数据能永久存储。
三、实践指导
.sql脚本只有第一次启动时创建(或说没有数据库时则会创建),已创建的,不会覆盖掉,否则这个机制就无法正式应用项目中。
在.sql脚本中,也可以创建账号、密码,这样就不用在docker-compose文件指定环境变量了。起到了一定的保护作用。
如果要完全迁移数据,需要将数据目录(文中为MysqL_data目录)与docker-compose.yml文件一起迁移。
MySQL启动时自动创建数据库的更多相关文章
- 让docker中的mysql启动时自动执行sql文件
本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...
- 让docker中的mysql启动时自动执行sql
在用docker创建mysql容器的时,有时候我们期望容器启动后数据库和表已经自动建好,初始化数据也已自动录入,也就是说容器启动后我们就能直接连上容器中的数据库,使用其中的数据了. 其实mysql的官 ...
- ssh整合思想 Spring与Hibernate的整合 项目在服务器启动则自动创建数据库表
Spring整合Hibernate Spring的Web项目中,web.xml文件会自动加载,以出现欢迎首页.也可以在这个文件中对Spring的配置文件进行监听,自启动配置文件, 以及之前Struts ...
- 查询事件状态,mysql查看事件是否开启,设置启动时自动开启方法
1.查看事件是否开启 SHOW VARIABLES LIKE 'event_scheduler' 2.设置当前事件开启 SET GLOBAL event_scheduler = 1; 或 SET GL ...
- Code First 迁移----官方 应用程序启动时自动升级(MigrateDatabaseToLatestVersion 初始值设定项)
Code First 迁移 如果使用的是 Code First 工作流,推荐使用 Code First 迁移改进应用程序的数据库架构. 迁移提供一组允许以下操作的工具: 创建可用于 EF 模型的初始数 ...
- SpringBoot使用Hibernate,实现自动创建数据库表【博客数据库设计】
我们准备设计博客,那就要设计数据库. 我们可以使用Hibernate来自动生成数据库. 博客数据库的结构: 实体类: 博客 Blog 博客分类 Type 博客标签 Tag 博客评论 Comment 用 ...
- EF自动创建数据库步骤之三(自定义数据库初始器)
EF自动创建数据库需要我们告诉数据库如何进行初始化:如创建表后是否需要插入一些基础数据,是否 需要创建存储过程.触发器等.还有就是EF有三种初始化方式(参见下面三个类): DropCreateData ...
- SpringBoot程序启动时在Oracle数据库中建表充值
例子工程下载链接:https://files.cnblogs.com/files/xiandedanteng/gatling20200428-1.zip 需求:在工程启动时在Oracle数据库中建表. ...
- EntityFramework SQLiteCodeFirst 自动创建数据库 关闭级联删除
外键的级联删除: 如A表中有主键idA, B表中设置外键(ForeignKey)为A表中的主键idA, 当A表中的记录被删除时, B表中所有引用此条记录的记录(即所有外键为idA的记录)将自动被删除 ...
- sql2008 计划自动创建数据库分区【转】
本文转自:http://jingyan.baidu.com/article/6b97984d9a26ec1ca3b0bf77.html sql2008 计划自动创建数据库分区 固定增量的数据,自动创建 ...
随机推荐
- Vue 如何实现组件切换的时候,让组件缓存,不会被销毁
使用场景:我们开发项目的时候,会遇到组件之间的切换,一般都是创建组件销毁组件来回切换 :但是现在需求是切换组件的时候,另一个组件不会销毁: 基于这个需求 ,我们使用 keep-live 组件包裹起来要 ...
- kotlin更多语言结构——>类型安全的构建器
通过使用命名得当的函数作为构建器,结合带有接收者的函数字面值,可以在 Kotlin 中创建类型安全.静态类型 的构建器 类型安全的构建器可以创建基于 Kotlin 的适用于采用半声明方式构建复杂层次数 ...
- 2024年网鼎杯青龙组 pwn
pwn2 开局泄露栈地址,又是栈溢出,直接栈转移拿下 from pwn import * from LibcSearcher import LibcSearcher #from Crypto.Util ...
- 深入解析C#异步编程:await 关键字背后的实现原理
C# 异步编程中 await 实现原理详解 在C#中,async 和 await 关键字用于编写异步代码.本文将详细介绍 await 的实现原理,包括状态机的生成.回调函数的注册和触发等关键步骤. 1 ...
- C# 将PDF文档转换为Markdown文档
将PDF文件转换为Markdown格式是一个非常实用的需求,尤其是在需要将内容从固定布局的PDF文件中提取出来,并转换为更易于编辑和处理的文本格式时.本文将介绍如何通过C#代码将PDF文档转换Mark ...
- uniapp对接个推推送以及模拟器调试
uniapp 推送需要配置的内容https://ask.dcloud.net.cn/article/35622 推送流程 参考 https://blog.csdn.net/m0_67401660/ar ...
- Socket编程与IO多路复用
0.引言 本篇博客将从socket模型为起点,引入IO多路复用的学习. 1.Socket模型 1.1.Socket的诞生 Socket的诞生背景: Socket最早出现在20实际80年代的Unix操作 ...
- 一步步教你学会如何区域录制屏幕转换成gif图
现在各种表情包都是gif图,包括很多可能比较短暂的操作步骤,录制gif图也要远比录制成视频要来的方便很多. 1. GIF文件通常比视频文件小,这使得它们在网络传输中更加高效,尤其是在带宽有限的情况下. ...
- Linux禁止某个sudo用户修改root密码
(1) 假设被禁止的sudo用户名为 user (2) 禁止user用户使用passwd命令更改密码(非最终配置) vim /etc/sudoers 加入 user ALL=(root)!/usr/b ...
- Zcmu-1178
思路: 分析题目要求的就是由2,3,5,7单独相乘或者组合相乘的数字. 所以将数字循环起来相乘,之后结果按从大到小地无重复放进数组当中. 学长 #include<set> #include ...