docker 生成mysql鏡像啟動時自動執(zhí)行sql

在docker 創(chuàng)建 mysql 容器時,往往需要在創(chuàng)建容器的過程中創(chuàng)建database 實例,代碼如下:

docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=my_db mysql:latest

MYSQL_ROOT_PASSWORD=123456,指定 root 用戶名密碼 123456
MYSQL_DATABASE=my_db 創(chuàng)建數(shù)據(jù)庫實例 my_db


但有時我們還希望在創(chuàng)建實例的過程中初始化我們的sql腳本,mysql的官方鏡像可以支持在容器啟動的時候自動執(zhí)行指定的sql腳本或者shell腳本,我們一起來看看mysql官方鏡像的Dockerfile,如下圖:

mysql 官方鏡像.png

已經(jīng)設(shè)定了ENTRYPOINT,里面會調(diào)用/entrypoint.sh這個腳本,腳本其中一段內(nèi)容如下圖:

屏幕快照 2017-08-24 下午1.17.39.png

遍歷docker-entrypoint-initdb.d目錄下所有的.sh和.sql后綴的文件并執(zhí)行。

原理清楚了,那我們就開始動手操作,思路是將數(shù)據(jù)庫初始化腳本拷貝到docker-entrypoint-initdb.d 目錄下,編寫Dockerfile 文件,內(nèi)容如下:

fileName: Dockerfile

#基礎(chǔ)鏡像使用 mysql:latest
FROM mysql:latest

#作者
MAINTAINER gjaxx <gjaxx@sohu.com>

#定義會被容器自動執(zhí)行的目錄
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#定義初始化sql文件
ENV INSTALL_DB_SQL init_database.sql

#把要執(zhí)行的sql文件放到/docker-entrypoint-initdb.d/目錄下,容器會自動執(zhí)行這個sql
COPY ./$INSTALL_DB_SQL $AUTO_RUN_DIR/

#給執(zhí)行文件增加可執(zhí)行權(quán)限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DB_SQL

fileName: init_database.sql

-- 建庫
CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;

-- 切換數(shù)據(jù)庫
use my_db;

-- 建表
DROP TABLE IF EXISTS `table1`;

CREATE TABLE `table1` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年齡',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 插入數(shù)據(jù)
INSERT INTO `table1` (`id`, `name`, `age`)
VALUES
(1,'姓名1',10),
(2,'姓名2',11);

生成鏡像

docker build -t init_mysql:0.0.1 .

“init_mysql:0.0.1”為鏡像名稱,“.” 表示Dockerfile在當(dāng)前路徑下,可以通過

docker images

命令查看本地鏡像,結(jié)果如下:

屏幕快照 2017-08-24 下午2.03.27.png

根據(jù)鏡像生成容器

docker run --name mysql -p 12345:3306 -e MYSQL_ROOT_PASSWORD=123456 -d init_mysql:0.0.1

“--name mysql” 指定容器名字,“-p 12345:3306”指定容器暴漏的端口號,“init_mysql:0.0.1” 鏡像名稱,通過

docker ps

命令查看運行中的容器,如下:

屏幕快照 2017-08-24 下午2.00.33.png

可以通過

docker exec -it CONTAINERID bin/bash

命令,進入運行中容器查看初始化腳本是否成功,其中“CONTAINERID” 為容器ID,進入容器后登錄mysql,可以看到my_db 已存在,table1已創(chuàng)建,表中已有初始化數(shù)據(jù)

mysql -uroot -p123456;
show databases;
use my_db;
select * from table1;

但以上方式有個問題,就是如果有多個sql文件,無法保證執(zhí)行順序,這就需要引入 sh 文件,思路是在docker-entrypoint-initdb.d 目錄下放置 sh 文件,在 sh 文件中依次執(zhí)行 sql 文件,編寫Dockerfile、install_db.sh、init_database.sql、init_table.sql、init_data.sql 文件,內(nèi)容如下:

fileName: Dockerfile

#基礎(chǔ)鏡像使用 mysql:latest
FROM mysql:latest

#作者
MAINTAINER gjaxx <gjaxx@sohu.com>

#定義工作目錄
ENV WORK_PATH /usr/local/work

#定義會被容器自動執(zhí)行的目錄
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#定義sql文件名
ENV FILE_0 init_database.sql 
ENV FILE_1 init_table.sql
ENV FILE_2 init_data.sql

#定義shell文件名
ENV INSTALL_DB_SHELL install_db.sh

#創(chuàng)建文件夾
RUN mkdir -p $WORK_PATH

#把數(shù)據(jù)庫初始化數(shù)據(jù)的文件復(fù)制到工作目錄下
COPY ./$FILE_0 $WORK_PATH/
COPY ./$FILE_1 $WORK_PATH/
COPY ./$FILE_2 $WORK_PATH/

#把要執(zhí)行的shell文件放到/docker-entrypoint-initdb.d/目錄下,容器會自動執(zhí)行這個shell
COPY ./$INSTALL_DB_SHELL $AUTO_RUN_DIR/

#給執(zhí)行文件增加可執(zhí)行權(quán)限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DB_SHELL

fileName:install_db.sh

mysql -uroot -p$MYSQL_ROOT_PASSWORD << EOF
source $WORK_PATH/$FILE_0;
source $WORK_PATH/$FILE_1;
source $WORK_PATH/$FILE_2; 

fileName:init_database.sql

CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;

fileName:init_table.sql

use my_db;

DROP TABLE IF EXISTS `table1`;

CREATE TABLE `table1` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年齡',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

fileName:init_data.sql

use my_db;

INSERT INTO `table1` (`id`, `name`, `age`)
VALUES
    (1,'姓名1',10),
    (2,'姓名2',11);

生成鏡像和容器代碼如上,這里就不重復(fù)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容