使用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. 使用c++爬取股市数据,获取最新行情

    最近自己动手写个小软件(界面原生态,还没来得及加样式哈).每天看看潜力股懒人做法,不介意推荐.资源有限,只能观察一下低价股,分析一下运动规律,什么时候拉升,惯性如何 主要功能:读取网络数据:保存本地数 ...

  2. 安装pystaller

    安装命令 # -i指定下载地址,此处采用清华大学镜像 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package pyin ...

  3. Node.js精进(5)——HTTP

    HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种获取网络资源(例如图像.HTML文档)的应用层协议,它是互联网数据通信的基础,由请求和响应构成. 在 Node ...

  4. Educational Codeforces Round 129 (Rated for Div. 2) A-D

    Educational Codeforces Round 129 (Rated for Div. 2) A-D A 题目 https://codeforces.com/contest/1681/pro ...

  5. C语言中限定符的作用

    C语言中常用的一般包括const.static.extern.register和volatile这几个.这些是C语言标准中规定的关键词,所有的编译器都必须支持这些关键词,它们的作用如下: 1.cons ...

  6. Tapdata PDK 生态共建计划启动!Doris、OceanBase、PolarDB、SequoiaDB 等十余家厂商首批加入

      2022年4月7日,Tapdata 正式启动 PDK 插件生态共建计划,致力于全面连接数据孤岛,加速构建更加开放的数据生态,以期让各行各业的使用者都能释放数据的价值,随时获取新鲜的数据.截至目前, ...

  7. day11 - 多线程

    1内容 进程.线程介绍 Java中 线程的实现方式 Thread 类 Runnable 接口 Callable 接口 线程相关的方法 线程安全问题 - 同步技术 线程等待唤醒机制 进程(Process ...

  8. JTable和MVC设计模式

    JTable: 用JTable类可以以表格的形式显示和编辑数据 . JTable类的对象并不存储数据,它只是数据的表现 data MVC ~数据,表现和控制三者分离,各负其责 ~M=Model(模型) ...

  9. 使用 Abp.Zero 搭建第三方登录模块(三):网页端开发

    ​简短回顾一下网页端的流程,总的来说网页端的职责有三: 生成一个随机字符作为鉴权会话的临时Token, 生成一个小程序码, Token作为参数固化于小程序码当中 监控整个鉴权过程状态,一旦状态变为AU ...

  10. SSH远程登录:两台或多台服务器之间免密登录设置

    有两台(或多台)同局域网的服务器A:192.168.2.21,B:192.168.2.25.让A,B这两台服务器之间能两两互相免密登录,并且每台服务器都可以自我免密登录(自我免密登录即:ssh loc ...