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脚本的执行日志。

(完)

最后修改于:2023年12月06日 03:23

添加新评论