美文网首页java高级开发
让docker中mysql启动自动执行sql

让docker中mysql启动自动执行sql

作者: 老鼠AI大米_Java全栈 | 来源:发表于2018-10-27 11:40 被阅读95次

mysql的官方镜像是支持这个能力的,在容器启动的时候自动执行指定的sql脚本或者shell脚本,我们一起来看看mysql官方镜像的Dockerfile,如下图:

image.png

已经设定了ENTRYPOINT,里面会调用/docker-entrypoint.sh这个脚本,我们把mysql:8.0.12这个镜像pull到本地,再用docker run启动起来,看看里面的docker-entrypoint.sh这个脚本的内容,有一段内容就是从固定目录下遍历所有的.sh和.sql后缀的文件,然后执行,如下图:


image.png
image.png

可以看到在mysql启动完成后会判断docker-entrypoint-initdb.d目录下是否有sh/sql/sql.gz文件,若有就执行初始化。

在docker上搭建disconf环境时,需要搭建mysql数据库,并且要依次执行四个sql文件分别对数据库,表,数据做初始化。
disconf源码下载,可以disconf/disconf-web/sql中查找相关sql文件。

我们编写一个脚本install-data.sh来完成,如下:

#!/bin/bash
echo "====>auto run mysql script..."
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
source $WORK_PATH/$FILE_0;
source $WORK_PATH/$FILE_1;
source $WORK_PATH/$FILE_2;
source $WORK_PATH/$FILE_3;
EOF

看得出shell很简单,登录mysql并执行指定的sql文件,MYSQL_ROOT_PASSWORD,WORK_PATH,FILE_0这些都是环境变量。
执行顺序:0-init_table.sql-> 1-init_data.sql-> 20151225.sql-> 20160701.sql

再来看看对应的Dockerfile怎么写,如下:

#docker image of disconf mysql
# VERSION 1.0
# Author: yxx

#基础镜像8.0.12
FROM daocloud.io/library/mysql:5.7

#作者
MAINTAINER weistar <weistar103@163.com>

#定义工作目录
ENV WORK_PATH /home/docker/disconf/mysql/work
#ENV SRC_PATH  /home/docker/disconf/mysql/sql

#定义容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#定义sql文件名
ENV FILE_0 0-init_table.sql
ENV FILE_1 1-init_data.sql
ENV FILE_2 20151225.sql
ENV FILE_3 20160701.sql

#定义shell文件名
ENV INSTALL_DATA_SHELL install-data.sh

#创建文件夹
RUN mkdir -p $WORK_PATH

#把数据库初始化数据的文件复制到工作目录下
COPY ./sql/$FILE_0 $WORK_PATH/
COPY ./sql/$FILE_1 $WORK_PATH/
COPY ./sql/$FILE_2 $WORK_PATH/
COPY ./sql/$FILE_3 $WORK_PATH/

#把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下
COPY ./$INSTALL_DATA_SHELL $AUTO_RUN_DIR/

#给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DATA_SHELL

#CMD ["sh", "/docker-entrypoint-initdb.d/docker-entrypoint.sh"]

0-init_table.sql,1-init_data.sql,20151225.sql,20160701.sql这四个文件就是我们要执行的sql,在构造docker镜像的时候被复制到镜像文件中。

在当前目录下执行命令docker build --rm -t disconf_mysql:1.0 .构建镜像.

启动镜像

[root@localhost mysql]# docker run --name mysqldisconf -e MYSQL_ROOT_PASSWORD=root  conf_mysql:1.0

可以通过日志查看

2018-10-27T03:03:56.598036Z 10 [Warning] [MY-010315] [Server] 'user' entry 'mysql.infoschema@localhost' ignored in --skip-name-resolve mode.
2018-10-27T03:03:56.598092Z 10 [Warning] [MY-010315] [Server] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
2018-10-27T03:03:56.598127Z 10 [Warning] [MY-010315] [Server] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
2018-10-27T03:03:56.598151Z 10 [Warning] [MY-010315] [Server] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
2018-10-27T03:03:56.598188Z 10 [Warning] [MY-010323] [Server] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
2018-10-27T03:03:56.598219Z 10 [Warning] [MY-010323] [Server] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
2018-10-27T03:03:56.598246Z 10 [Warning] [MY-010311] [Server] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
2018-10-27T03:03:56.598530Z 10 [Warning] [MY-010330] [Server] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
2018-10-27T03:03:56.598554Z 10 [Warning] [MY-010330] [Server] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.

/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/install-data.sh
====>auto run mysql script...
mysql: [Warning] Using a password on the command line interface can be insecure.

2018-10-27T03:03:59.457645Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.12)  MySQL Community Server - GPL.

可以看到脚本执行了,我们还可以使用另一种方式启动镜像

启动镜像 by compose
当前目录下创建文件docker-compose.yml,内容如下:

version: '3'
services:
  disconf_mysql: 
    image: conf_mysql:1.0
    hostname: disconf_mysql
    environment:
      MYSQL_ROOT_PASSWORD: root #shell执行时所需的环境变量
    restart: always

输入命令docker-compose up启动镜像
注意,此方式看不到上面脚本执行的日志(奇怪)

去数据库容器看下,数据是否初始化,执行docker exec -it mysqldisconf /bin/bash进入容器,docker与docker-compose的容器名不一样。
执行mysql -uroot -proot登录mysql查看

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| disconf            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> use disconf
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------+
| Tables_in_disconf |
+-------------------+
| app               |
| config            |
| config_history    |
| env               |
| role              |
| role_resource     |
| user              |
+-------------------+
7 rows in set (0.00 sec)

可以看到mysql在启动后依次导入了sql。
学习交流群:64691032

相关文章

网友评论

    本文标题:让docker中mysql启动自动执行sql

    本文链接:https://www.haomeiwen.com/subject/opzrtqtx.html