Dockerfile

新建文件名为Dockerfile的文件,内容如下 将Dockerfile文件与init_db放在同一目录中

  1. #基础镜像使用 mysql:5.7
  2. FROM mysql:5.7
  3. #作者
  4. MAINTAINER devin<devin@mobikok.com>
  5. #定义会被容器自动执行的目录
  6. ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
  7. #定义初始化sql文件
  8. ENV INSTALL_DB_SQL init_db.sql
  9. #把要执行的sql文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个sql
  10. COPY ./$INSTALL_DB_SQL $AUTO_RUN_DIR/
  11. #给执行文件增加可执行权限
  12. RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DB_SQL

生成镜像

#test_mysql:0.0.1为镜像名称 “.” 表示Dockerfile在当前路径下
docker build -t test_mysql:0.0.1 .

查看镜像

docker images

根据镜像生成容器

#“--name mysql” 指定容器名字,“-p 12345:3306”指定容器暴漏的端口号,“init_mysql:0.0.1” 镜像名称
docker run --name mysql -p 12345:3306 -e MYSQL_ROOT_PASSWORD=123456 -d test_mysql:0.0.1

进入容器

#CONTAINERID为容器ID
docker exec -it CONTAINERID bin/bash

处理多sql文件

通过以上方式有个问题,就是如果有多个sql文件,无法保证执行顺序,这就需要引入 sh 文件,思路是在docker-entrypoint-initdb.d 目录下放置 sh 文件,在 sh 文件中依次执行 sql 文件,编写Dockerfile、install_db.sh、init_database.sql、init_table.sql、init_data.sql 文件,内容如下:

Dockerfile
#基础镜像使用 mysql:5.7
FROM mysql:5.7
#作者
MAINTAINER devin<devin@mobikok.com>
#定义工作目录
ENV WORK_PATH /usr/local/work
#定义会被容器自动执行的目录
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
#创建文件夹
RUN mkdir -p $WORK_PATH
#把数据库初始化数据的文件复制到工作目录下
COPY ./$FILE_0 $WORK_PATH/
COPY ./$FILE_1 $WORK_PATH/
COPY ./$FILE_2 $WORK_PATH/
#把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell
COPY ./$INSTALL_DB_SHELL $AUTO_RUN_DIR/
#给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DB_SHELL

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;