Dockerfile
新建文件名为Dockerfile的文件,内容如下 将Dockerfile文件与init_db放在同一目录中
#基础镜像使用 mysql:5.7
FROM mysql:5.7
#作者
MAINTAINER devin<devin@mobikok.com>
#定义会被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
#定义初始化sql文件
ENV INSTALL_DB_SQL init_db.sql
#把要执行的sql文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个sql
COPY ./$INSTALL_DB_SQL $AUTO_RUN_DIR/
#给执行文件增加可执行权限
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;