51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

docker部署mysql并且初始化数据库

docker部署mysql并且初始化数据库

需求: 我们在用docker 部署 mysql 的时候, 需要 初始化数据库一些数据,或者 执行一些sql脚本。

mysql官方镜像支持在容器初次启动时自动执行指定的sql脚本或shell脚本(注意:只有初次启动时才能自动执行),在mysql官方的Dockerfile中有下面几句话:(mysql官方地址)

COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]

在容器创建时会调用docker-entrypoint.sh这个脚本,这个脚本会遍历docker-entrypoint-initdb.d目录下所有的.sh和.sql后缀的所有脚本并执行,执行顺序为脚本文件名称排序。

我们做一下测试:

根据mysql官方给出的Dockerfile可知,把我们要初始化的sql脚本放到docker-entrypoint-initdb.d目录下,在mysql容器创建的时候就会根据脚本自动初始化。

我这里是使用的是centos7环境

1.Dockerfile

下面来编写Dockerfile

FROM mysql:5.7
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
ENV INSTALL_DB_SQL init_database.sql
COPY ./$INSTALL_DB_SQL $AUTO_RUN_DIR/
RUN chmod 777 $AUTO_RUN_DIR/$INSTALL_DB_SQL

Dockerfile说明:

FROM:从mysql:5.7镜像拉取;

ENV:定义环境变量

COPY:拷贝

RUN:执行

记得要给sql脚本文件添加可执行权限,chmod a+x 也可以

2.编写sql脚本

把写好的sql脚本放到与Dockerfile同级的目录下

比如:

-- 建库
CREATE DATABASE IF NOT EXISTS test_db default charset utf8 COLLATE utf8_general_ci;
 
-- 切换数据库
use test_db;
 
-- 建表
DROP TABLE IF EXISTS `test_table`;
 
CREATE TABLE `test_table` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
`sex` varchar(11) DEFAULT NULL COMMENT '性别',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- 插入数据
INSERT INTO `test_table` (`id`, `name`, `sex`)
VALUES
(1,'张三','男'),
(2,'李四','女');

3.构建镜像并启动容器

将Dockerfile和sql脚本编写好后构建镜像

docker build -t init_mysql:v0.1 .

查看镜像

docker images | grep init_mysql

创建mysql容器后查看状态

docker run --name mysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=root -d init_mysql:v0.1

docker ps -a | grep mysql

至此创建mysql容器并初始化已完成

三、验证

进入到mysql容器中,查看docker-entrypoint-initdb.d/目录下是否有我们的sql脚本

进入mysql,输入密码后,查看sql脚本创建的库、表、数据是否存在

mysql -u root -p

show databases;
use test_db;
show tables;
select * from test_table;

到此结束

赞(2)
未经允许不得转载:工具盒子 » docker部署mysql并且初始化数据库