Docker制作MySQL镜像使用docker-entrypoint-initdb.d机制初始化数据库
前言
本文我们主要讲解在Docker制作MySQL镜像时,如何通过docker-entrypoint-initdb.d机制来初始化数据库。
制作MySQL镜像时,如何初始化数据库呢?
MySQL官方给我们提供了很简单的方案:
用户只需要将准备好的初始化脚本拷贝至MySQL镜像内的docker-entrypoint-initdb.d目录即可。
docker-entrypoint-initdb.d机制
首次启动容器时,默认会执行docker-entrypoint-initdb.d目录下的.sh、.sql和.sql.gz的脚本;如果有多个按文件名的字母顺序执行。
docker-entrypoint-initdb.d目录下的脚本只有在MySQL容器首次启动时才会被执行,如果容器已经存在并正常运行,那么再次启动容器时,这些脚本不会被重新执行。
在测试脚本时,如果我们修改了脚本文件并希望重新执行它们,那我们就需要删除现有的MySQL容器以及挂载的数据卷目录。在重新创建容器时,才会重新执行docker-entrypoint-initdb.d下的脚本。
注意:删除数据卷目录文件时,将会永久丢失其中的所有数据,请确保在执行此操作之前进行必要的备份。
MySQL镜像dockerfile
MySQL镜像dockerfile示例如下:
# 基础镜像
FROM mysql:8.0.33
# author
MAINTAINER smaple
# 定义工作目录
ENV WORK_PATH /usr/local/mysql
# 添加sql脚本
ADD ./db/*.sql $WORK_PATH/
# 添加init_db.sh可执行文件
ADD ./db/init_db.sh /docker-entrypoint-initdb.d/
# 给可执行文件增加可执行权限
RUN chmod a+x /docker-entrypoint-initdb.d/init_db.sh
如上所示,我们也有多个SQL脚本,我们是将数据库的初始化工作全部放在init_db.sh脚本,在其中按自己需求完成多个脚本的执行。
数据库初始化
构建镜像,并执行数据库初始化工作。
#!/bin/sh
cd /data/docker/mysql
# 构建mysql-8.0.33镜像
sudo docker build --no-cache=true -t mysql:8.0.33 .
# 运行镜像文件,执行数据库初始化工作
sudo docker-compose up smaple-mysql
docker build构建日志中,我们可以看到dockerfile的构建步骤。
docker-compose中smaple-mysql容器启动时,我们可以看到init_db.sh脚本的执行日志。
(完)