Docker制作MySQL镜像并使用`/docker-entrypoint-initdb.d/`问题

 更新时间:2024年05月22日 08:50:21   作者:小子宝丁  
这篇文章主要介绍了Docker制作MySQL镜像并使用`/docker-entrypoint-initdb.d/`问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

需求

制作一个 MySQL Docker 镜像并初始化数据库信息

环境

  • win 11
  • Docker-Desktop 4.14.0 (91374)

分析

启动一个MySQL容器很容易。如何初始化数据呢?

大概我们会尝试很多操作,比如百度常见到 使用 CMD 命令调用shell脚本,通过shell脚本处理初始化数据等等,经过实践,这些都不太方便。

其实,MySQL 官方提供了很简单的方案,用户只需要准备好 初始化脚本,并把这些初始化脚本在制作镜像时拷贝到 MySQL 镜像内的 /docker-entrypoint-initdb.d 文件夹中即可。

MySQL 数据初始化机制

在 Docker hub 官网中,MySQL镜像首页提供了很多初始化数据的方式,包括数据的导入、导出等。

下面是官方对使用 /docker-entrypoint-initdb.d 初始化数据的描述:

原文

When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. You can easily populate your mysql services by mounting a SQL dump into that directory and provide custom images with contributed data. SQL files will be imported by default to the database specified by the MYSQL_DATABASE variable.

译文

首次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行扩展名为 /docker-entrypoint-initdb.d 中的扩展名 .sh、.sql 和 .sql.gz 的文件。文件将按字母顺序执行。您可以通过将 SQL 转储挂载到该目录中来轻松填充 mysql 服务,并为包含贡献数据的自定义映像提供。默认情况下,SQL 文件将导入到 MYSQL_DATABASE 变量指定的数据库中。

实例

本例将通过 Dockerfile 构建一个docker 镜像,并在该容器中初始化数据。

1、编写 Dockerfile

创建Dockerfile文件,并输入如下内容

FROM mysql:5.7

# 将 xzbd.sql 放到 docker 初始化文件家中
COPY xzbd.sql /docker-entrypoint-initdb.d/xzbd.sql

该镜像基于 MySQL 5.7 制作,命名 COPY xzbd.sql /docker-entrypoint-initdb.d/xzbd.sql 是把初始化 SQL 添加到 MySQL 镜像的 /docker-entrypoint-initdb.d 目录中

2、xzbd.sql 文件

该文件为自定义的数据库文件,内容如下:

create database if not exists xzbd;
use xzbd;

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for x_item
-- ----------------------------
DROP TABLE IF EXISTS `x_item`;
CREATE TABLE `x_item`
(
    `id`     INT AUTO_INCREMENT PRIMARY KEY,
    `name`   VARCHAR(10) NOT NULL COMMENT '元素名称',
    `status` VARCHAR(10) NOT NULL COMMENT '元素状态',
    `icon`   VARCHAR(50) NOT NULL COMMENT 'ICON',
    `type`   VARCHAR(50) NOT NULL COMMENT '类型',
    CONSTRAINT x_item_name_uindex UNIQUE (name)
) ENGINE = InnoDB
  CHARACTER SET = utf8mb4 COMMENT 'X子项'
  ROW_FORMAT = Dynamic;

-- 初始化 X子项
INSERT INTO `x_item`(`id`, `name`, `status`, `icon`, `type`) VALUES (27, 'XItem02', 'ENABLE', 'ITEM_9', 'ITEM_9');
INSERT INTO `x_item`(`id`, `name`, `status`, `icon`, `type`) VALUES (28, 'XItem03', 'ENABLE', 'ITEM_10', 'ITEM_10');
INSERT INTO `x_item`(`id`, `name`, `status`, `icon`, `type`) VALUES (29, 'XItem04', 'ENABLE', 'ITEM_11', 'ITEM_11');
INSERT INTO `x_item`(`id`, `name`, `status`, `icon`, `type`) VALUES (30, 'XItem05', 'ENABLE', 'ITEM_12', 'ITEM_12');
INSERT INTO `x_item`(`id`, `name`, `status`, `icon`, `type`) VALUES (31, 'XItem06', 'ENABLE', 'ITEM_13', 'ITEM_13');
INSERT INTO `x_item`(`id`, `name`, `status`, `icon`, `type`) VALUES (32, 'XItem07', 'ENABLE', 'ITEM_14', 'ITEM_14');
INSERT INTO `x_item`(`id`, `name`, `status`, `icon`, `type`) VALUES (33, 'XItem08', 'ENABLE', 'ITEM_15', 'ITEM_15');
INSERT INTO `x_item`(`id`, `name`, `status`, `icon`, `type`) VALUES (34, 'XItem08', 'ENABLE', 'ITEM_16', 'ITEM_16');

该脚本中主要做了如下内容

  • 创建了一个数据库 xzbd
  • 创建表 x_item
  • 给表 x_item 中插入8 条数据

文件准备及目录结构如下图所示:

3、构建镜像

构建镜像 mysql-xzbd:0.1.0 , 命令如下:

docker build -t mysql-xzbd:0.1.0 .

注意命令最后的那个 .

构建过程如下:

构建成功后,使用 docker images 查看是否有 mysql-xzbd 镜像,且版本为 0.1.0

结果如下:

上图中使用了 findstr 过滤,在 linux 操作系统应将其换为 grep

4、运行

使用刚刚构建的 mysql-xzbd:0.1.0 镜像运行一个容器。

# 运行容器
docker run --name mysql-xzbd-servevr -it -d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql-xzbd:0.1.0

# 查看是否启动成功
docker ps

5、验证

验证容器 mysql-xzbd-servevr 中是否创建了数据库 xzbd,并查看其内部是否有 x_item 表,且内部是否拥有初始化数据。

  • 进入容器
docker exec -it mysql-xzbd-servevr sh
  • 登录 MySQL
mysql -uroot -p

输入密码 123456 。登录成功后效果如下:

  • 查看数据库
show databases;
  • 查看数据表
use xzbd;
show tables;
  • 查看表 x_item 中的数据
select * from x_item;

总结

本文介绍了使用Dockerfile构建有初始化数据MySQL镜像包的详细过程。

通过验证,使用 /docker-entrypoint-initdb.d 初始化数据是可行的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker-利用dockerfile来搭建tomcat服务的方法

    Docker-利用dockerfile来搭建tomcat服务的方法

    这篇文章主要介绍了Docker-利用dockerfile来搭建tomcat服务的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Docker镜像保存为文件及从文件导入镜像的方法

    Docker镜像保存为文件及从文件导入镜像的方法

    本篇文章主要介绍了Docker镜像保存为文件及从文件导入镜像的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • 轻量级对象存储服务minio安装及浏览器使用教程

    轻量级对象存储服务minio安装及浏览器使用教程

    本次介绍了minio的安装及浏览器中的简单使用,对轻量级对象存储服务minio安装及使用教程感兴趣的朋友一起看看吧
    2021-10-10
  • 5分钟安装docker详细步骤

    5分钟安装docker详细步骤

    官方推荐使用通过设置docker仓库的方法来安装,安装和升级都简单些,今天就来教大家5分钟入手安装docker教程超详细的安装步骤,感兴趣的朋友一起看看吧
    2021-05-05
  • docker客户端访问harbor及安装配置更新

    docker客户端访问harbor及安装配置更新

    这篇文章主要介绍了docker客户端访问harbor以及harbor的安装配置更新步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Docker安装官方Redis镜像并启用密码认证

    Docker安装官方Redis镜像并启用密码认证

    这篇文章主要介绍了Docker安装官方Redis镜像并启用密码认证,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Docker安装node-red、导入节点、部署查看的步骤详解

    Docker安装node-red、导入节点、部署查看的步骤详解

    Node-RED设计使用的场景是IoT,但是作为一个流编排引擎,显然它能做的事情更多,比如使用容器化的方式进行构建、打包、部署等操作也是可行的,这篇文章继续介绍Docker安装node-red、导入节点、部署查看的相关知识,感兴趣的朋友一起看看吧
    2022-01-01
  • docker没有错误日志,镜像服务却启动不成功的问题以及排查方式

    docker没有错误日志,镜像服务却启动不成功的问题以及排查方式

    这篇文章主要介绍了docker没有错误日志,镜像服务却启动不成功的问题以及排查方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Docker 文件系统-AUFS 原理介绍

    Docker 文件系统-AUFS 原理介绍

    这篇文章主要介绍了Docker 文件系统-AUFS原理,Docker 主要是基于 Namespace、cgroups 和联合文件系统这三大核心技术实现的,下文相关内容需要的小伙伴可以参考一下
    2022-04-04
  • docker多容器操作与强制删除容器的方法步骤

    docker多容器操作与强制删除容器的方法步骤

    有时候我们会有很多已经停止的容器或者由于错误强制退出不能用的容器,那我们就需要删除了,下面这篇文章主要给大家介绍了关于docker多容器操作与强制删除容器的方法步骤,需要的朋友可以参考下
    2022-11-11

最新评论