一、前言
在使用docker部署mysql服务时,往往需要在创建容器时新建database,在需要在创建实例的过程中希望初始化sql脚本。
mysql官方镜像支持在容器初次启动时自动执行指定的sql脚本或shell脚本(注意:只有初次启动时才能自动执行),在mysql官方的Dockerfile中有下面几句话:
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;
END!