使用docker 构建mysql镜像,并在容器初次创建时初始化数据

Dockerfile

FROM mysql:5.7.23

MAINTAINER gradyjiang "jiangzhongjin@hotmail.com"

ENV LANG C.UTF-8

# 当前父目录
ENV PARENT_DIR . # 容器内 mysql 工作目录
ENV CONTAINER_WORK_PATH /usr/local # 被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d # 初始化数据库的SQL
ENV DDL_SQL V1.0_DDL.sql
ENV DML_SQL V1.0_DML.sql # 执行SQL的脚本
ENV INSTALL_DATA_SHELL install_data.sh COPY $PARENT_DIR/$DDL_SQL $CONTAINER_WORK_PATH/ COPY $PARENT_DIR/$DML_SQL $CONTAINER_WORK_PATH/ COPY $PARENT_DIR/$INSTALL_DATA_SHELL $AUTO_RUN_DIR/ RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DATA_SHELL

/docker-entrypoint-initdb.d 是 mysql镜像的自动执行目录,会自动执行内部的SQL脚本和linux脚本;但仅在第一次创建时执行

查看docker-entrypoint.sh (即执行docker-entrypoint-initdb.d 内的文件的脚本)可知,一旦数据库创建(即数据库数据目录已存在),将不会执行该目录中的文件;

一下是其中重点代码

# Loads various settings that are used elsewhere in the script
# This should be called after mysql_check_config, but before any other functions
docker_setup_env() {
# Get config
declare -g DATADIR SOCKET
DATADIR="$(mysql_get_config 'datadir' "$@")"
SOCKET="$(mysql_get_config 'socket' "$@")" # Initialize values that might be stored in a file
file_env 'MYSQL_ROOT_HOST' '%'
file_env 'MYSQL_DATABASE'
file_env 'MYSQL_USER'
file_env 'MYSQL_PASSWORD'
file_env 'MYSQL_ROOT_PASSWORD' declare -g DATABASE_ALREADY_EXISTS
if [ -d "$DATADIR/mysql" ]; then
DATABASE_ALREADY_EXISTS='true'
fi
} _main() {
...
...
# there's no database, so it needs to be initialized
if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
docker_verify_minimum_env
docker_init_database_dir "$@" mysql_note "Starting temporary server"
docker_temp_server_start "$@"
mysql_note "Temporary server started." docker_setup_db
docker_process_init_files /docker-entrypoint-initdb.d/* mysql_expire_root_user mysql_note "Stopping temporary server"
docker_temp_server_stop
mysql_note "Temporary server stopped" echo
mysql_note "MySQL init process done. Ready for start up."
echo
fi
fi
exec "$@"
}

由于有两个脚本,可能在执行顺序上不一样,所以需要用一个脚本来执行

#!/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
source $CONTAINER_WORK_PATH/$DDL_SQL;
source $CONTAINER_WORK_PATH/$DML_SQL;
构建镜像脚本 build-image-fim-mysql.sh
echo "开始构建 fim-mysql 镜像..."

docker build -t fim-mysql:1.0 ./fim-mysql
执行创建容器命令 docker-run-fim-mysql.sh
docker run --name fim-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d fim-mysql:1.0

MYSQL_ROOT_PASSWORD=123456,指定 root 用户名密码 123456

MYSQL_DATABASE=my_db 创建数据库实例 my_db

使用Dockfile构建mysql镜像与初始化运行mysql容器的更多相关文章

  1. Window中的Docker 拉取Mysql镜像 并在本地Navicate链接

    首先本地   拉取mysql镜像 以下是所有mysql镜像 我自己下载的为5.6   下面 以5.6为例:(拉取mysql5.6镜像) docker pull mysql:5.6 创建一个容器 doc ...

  2. Docker | 第五章:构建自定义镜像

    前言 上一章节,主要是介绍了下Dockerfile的一些常用命令的说明.我们知道,利用Dockerfile可以构建一个新的镜像,比如运行Java环境,就需要一个JDK环境的镜像,但直接使用公共的镜像时 ...

  3. 利用Docker手动构建WebLogic镜像的步骤

    info 我的Docker环境信息如下: [root@localhost ~]# docker info -f " OSType: {{.OperatingSystem}} {{.Archi ...

  4. 使用docker制作Mysql镜像

     一.过程说明 通过Dockerfile创建mysql镜像,使用的mysql软件包为mariadb二进制分发版,最终在宿主机启动mysql容器从而能在mysql容器外部访问mysql服务. 宿主机IP ...

  5. 详解使用DockerHub官方的mysql镜像生成容器

    详解使用DockerHub官方的mysql镜像生成容器 收藏 yope 发表于 10个月前 阅读 1506 收藏 32 点赞 1 评论 0 腾讯云·云上实验室:开发者零门槛,免费使用真机在线实验!&g ...

  6. mac使用brew安装mysql报RROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

    使用mac安装mysql安装完后运行 mysql -uroot -p 报了 ERROR 2002 (HY000): Can't connect to local MySQL server throug ...

  7. 利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置

    本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...

  8. 详解利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置

    本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...

  9. 用Docker构建MySQL镜像

    构建MySQL镜像 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过D ...

随机推荐

  1. jenkins配置自动执行sql脚本

    shell脚本: bigsql="select big_version,small_version from d0mstore.db_current_version order by big ...

  2. centos7.6部署DRBD提示“no resources defined!

    环境准备: node1(主节点)IP: 192.168.26.30 主机名:node1node2(从节点)IP: 192.168.26.31 主机名:node2 1.关闭防火墙和selinux #se ...

  3. Python简单实现自动评论、自动点赞、自动关注脚本

    一些哔哔: 今天的这个脚本,是一个别人发的外包,交互界面的代码就不在这里说了,但是可以分享下自动评论.自动点赞.自动关注.采集评论和视频的数据是如何实现的 开发环境 python 3.8 运行代码py ...

  4. docker删除镜像报错 Error response from daemon: conflict: unable to delete f73fe6298efc (cannot be forced) - image has dependent child images

    方法1 docker rmi 镜像ID 方法2 docker rmi -f 镜像ID 方法3 docker rmi 镜像仓库名:tag

  5. 使用Navicat创建存储过程(顺带插入百万级数据量)

    一.建表 DROP TABLE IF EXISTS `test_user`; CREATE TABLE `test_user` ( `id` bigint(20) PRIMARY key not nu ...

  6. Markdown第一次学习

    # # Markdown学习 一级标题: #空格+标题名称+回车得到一级标题 ## 二级标题 一级标题方法中变成两个##号 ### 三级标题 变成三个###号,以此类推,最多到六级标题 ## 字体 h ...

  7. 实时数据引擎系列(五): 关于 SQL Server 与 SQL Server CDC

      摘要:在企业客户里, SQL Server 在传统的制造业依然散发着持久的生命力,SQL Server 的 CDC 复杂度相比 Oracle 较低, 因此标准的官方派做法就是直接使用这个 CDC ...

  8. SpringBoot接口 - 如何优雅的写Controller并统一异常处理?

    SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例,如何优雅的将参数校验的错误信息统一处理并封装返回呢?@pdai 为什么要优雅的处理异常 如果我们不统一的处理异常,经 ...

  9. Solution -「CF113D」Museum

    Upd 2021.10.21 更改了状态定义. 记 \(S(u)\) 表示 \(u\) 结点的相邻结点的集合. 又记 \(p(u)\) 表示走到了 \(u\) 且下一步继续留在 \(u\) 结点的概率 ...

  10. DelayQueue达到定时触发效果

    DelayQueue的特点就是插入Queue中的数据可以按照自定义的delay时间进行排序.只有delay时间小于0的元素才能够被取出. 这样子,只要开启一个线程循环从DelayQueue中取值执行, ...