在docker 创建 mysql 容器时,往往需要在创建容器的过程中创建database 实例,代码如下:

docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=my_db mysql:latest

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

MYSQL_DATABASE=my_db 创建数据库实例 my_db

但有时我们还希望在创建实例的过程中初始化我们的sql脚本,mysql的官方镜像可以支持在容器启动的时候自动执行指定的sql脚本或者shell脚本,我们一起来看看mysql官方镜像的Dockerfile,如下图:

mysql 官方镜像.png

已经设定了ENTRYPOINT,里面会调用/entrypoint.sh这个脚本,脚本其中一段内容如下图:

屏幕快照 2017-08-24 下午1.17.39.png

遍历docker-entrypoint-initdb.d目录下所有的.sh和.sql后缀的文件并执行。

原理清楚了,那我们就开始动手操作,思路是将数据库初始化脚本拷贝到docker-entrypoint-initdb.d 目录下,编写Dockerfile 文件,内容如下:

fileName: Dockerfile

#基础镜像使用 mysql:latest

FROM mysql:latest

#作者

MAINTAINER gjaxx

#定义会被容器自动执行的目录

ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#定义初始化sql文件

ENV INSTALL_DB_SQL init_database.sql

#把要执行的sql文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个sql

COPY ./$INSTALL_DB_SQL $AUTO_RUN_DIR/

#给执行文件增加可执行权限

RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DB_SQL

fileName: init_database.sql

-- 建库

CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;

-- 切换数据库

use my_db;

-- 建表

DROP TABLE IF EXISTS `table1`;

CREATE TABLE `table1` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(20) DEFAULT NULL COMMENT '姓名',

`age` int(11) DEFAULT NULL COMMENT '年龄',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 插入数据

INSERT INTO `table1` (`id`, `name`, `age`)

VALUES

(1,'姓名1',10),

(2,'姓名2',11);

生成镜像

docker build -t init_mysql:0.0.1 .

“init_mysql:0.0.1”为镜像名称,“.” 表示Dockerfile在当前路径下,可以通过

docker images

命令查看本地镜像,结果如下:

屏幕快照 2017-08-24 下午2.03.27.png

根据镜像生成容器

docker run --name mysql -p 12345:3306 -e MYSQL_ROOT_PASSWORD=123456 -d init_mysql:0.0.1

“--name mysql” 指定容器名字,“-p 12345:3306”指定容器暴漏的端口号,“init_mysql:0.0.1” 镜像名称,通过

docker ps

命令查看运行中的容器,如下:

屏幕快照 2017-08-24 下午2.00.33.png

可以通过

docker exec -it CONTAINERID bin/bash

命令,进入运行中容器查看初始化脚本是否成功,其中“CONTAINERID” 为容器ID,进入容器后登录mysql,可以看到my_db 已存在,table1已创建,表中已有初始化数据

mysql -uroot -p123456;

show databases;

use my_db;

select * from table1;

但以上方式有个问题,就是如果有多个sql文件,无法保证执行顺序,这就需要引入 sh 文件,思路是在docker-entrypoint-initdb.d 目录下放置 sh 文件,在 sh 文件中依次执行 sql 文件,编写Dockerfile、install_db.sh、init_database.sql、init_table.sql、init_data.sql 文件,内容如下:

fileName: Dockerfile

#基础镜像使用 mysql:latest

FROM mysql:latest

#作者

MAINTAINER gjaxx

#定义工作目录

ENV WORK_PATH /usr/local/work

#定义会被容器自动执行的目录

ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#定义sql文件名

ENV FILE_0 init_database.sql

ENV FILE_1 init_table.sql

ENV FILE_2 init_data.sql

#定义shell文件名

ENV INSTALL_DB_SHELL install_db.sh

#创建文件夹

RUN mkdir -p $WORK_PATH

#把数据库初始化数据的文件复制到工作目录下

COPY ./$FILE_0 $WORK_PATH/

COPY ./$FILE_1 $WORK_PATH/

COPY ./$FILE_2 $WORK_PATH/

#把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell

COPY ./$INSTALL_DB_SHELL $AUTO_RUN_DIR/

#给执行文件增加可执行权限

RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DB_SHELL

fileName:install_db.sh

mysql -uroot -p$MYSQL_ROOT_PASSWORD << EOF

source $WORK_PATH/$FILE_0;

source $WORK_PATH/$FILE_1;

source $WORK_PATH/$FILE_2;

fileName:init_database.sql

CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;

fileName:init_table.sql

use my_db;

DROP TABLE IF EXISTS `table1`;

CREATE TABLE `table1` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(20) DEFAULT NULL COMMENT '姓名',

`age` int(11) DEFAULT NULL COMMENT '年龄',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

fileName:init_data.sql

use my_db;

INSERT INTO `table1` (`id`, `name`, `age`)

VALUES

(1,'姓名1',10),

(2,'姓名2',11);

生成镜像和容器代码如上,这里就不重复了。

docker 运行mysql镜像_docker 生成mysql镜像启动时自动执行sql相关推荐

  1. Android 编程下帧动画在 Activity 启动时自动运行的几种方式

    Android 开发过程中部分 Activity 在显示的时候就要求给用户显示一个进度框来改善用户体验,比如:Activity 在启动的时候就去联网请求数据.读取数据库内容等.进度框显示样式如下,采用 ...

  2. docker mysql编辑器_docker官方mysql镜像自定义配置详解

    之前为了节省安装时间,所以用官方mysql docker镜像启动mysql. 通过 $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-s ...

  3. docker mysql 不稳定_docker 的 mysql 容器运行一段时间后崩溃

    最近发现博客有时候会挂,发现是 mysql 的容器停了,然后 start 之后恢复了,然后又会不知什么时候自己挂掉 我用的是 docker 官方的 mysql 镜像,启动方式应该也没问题 docker ...

  4. docker mysql 日志_docker中将MySQL运行在容器中失败提示“ InnoDB : Error 22 with aio_write”的解决办法...

    今天利用docker容器创建mysql8.0的时候(window系统),指定了本地宿主机器的一个目录为容器mysql的datadir目录,发现创建失败了. 创建命令: $ docker run -d ...

  5. 远程连接docker中的mysql容器_docker构建mysql容器及Navicat 远程连接

    1. MySQL部署 1.1拉取MySQL镜像 docker pull mysql 查看镜像 docker images 1.2创建MySQL容器 首先建立所需要的 文件夹: docker run - ...

  6. 系统制成docker镜像_Docker学习以及镜像制作流程

    一.何为Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

  7. docker安装mysql指定_Docker安装MySql,并且使用外部客户端链接

    本篇博客主要记录在centos7当中安装mysql,并且安装完成之后使用外部客户端链接. 一.查看docker环境是否正常 在命令行使用docker search mysql: 如果能查出来证明doc ...

  8. docker 运行 php nginx_docker搭建nginx+mysql+php

    主要概念是 容器 和 镜像. 要先有镜像,启动镜像后,才有容器的出现. 不恰当地用类和实例来理解,镜像是类,容器是实例. 部分命令 拉取镜像docker pull {{具体镜像}}查看本机镜像dock ...

  9. docker mysql8.0挂载_Docker安装MySQL 8.0.17 并挂载数据及配置文件,修改时区

    一般来说是不需要手动指定MySQL挂载卷,因为mysql会自动挂载, 通过 dokcer inspect 你的容器名称 可以查看容器已挂载的路径 /var/lib/docker/volumes/855 ...

最新文章

  1. 用AfxExtractSubString()解析复合串
  2. 格式说明_法律文书:公司单位民事起诉状格式范本及说明,最高人民法院2016...
  3. [力扣]1018_可被5整除的二进制前缀
  4. android udp 设备发现,两台Android设备之间进行UDP连接(使用多播地址)~~求大神指点...
  5. Suse11开启SSH密码登录
  6. 光流(五)--HS光流及稠密光流
  7. mysql外键设置sql语句_数据库sql语句如何设置外键
  8. 桌面右下角出现“测试模式 Windows7 内部版本7601”怎么回事?
  9. 破解电视盒 运营商送的,各种型号。通用 TTL 破解电视盒,更新华为悦盒
  10. iOS 图片裁剪功能。
  11. conda deactivate python3_无法访问conda环境中的activate、deactivate或conda
  12. 炫龙银魂t1配置_高配好用不贵炫龙银魂T1让你体验到真正性价比
  13. html鼠标在ie上抖动,IE下CSS3动画抖动
  14. 点阵、基元和晶体结构之间的关系
  15. 知乎上40个有趣回复,很精辟
  16. Android即时通讯--仿QQ即时聊天:(一)初识Socket
  17. 设计模式学习(八) 模板方法模式
  18. AutoCAD2016安装破解教程
  19. 【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
  20. 对作用域、作用域链的理解

热门文章

  1. The Turn Model for Adaptive Routing中的west-first算法
  2. NLP简报(Issue#4):Turing-NLG、REALM、ERNIE-GEN、Transformer attention可视化等等
  3. qt向服务器传输文字_Qt实现客户端与服务器消息发送
  4. Java-包、权限修饰符final、static
  5. 蓝桥杯 算法训练 Sticks
  6. 数学建模4 拟合算法
  7. 蓝桥杯 基础练习 字母图形
  8. redis_基础_基本使用
  9. 「译」MotionLayout 介绍 (part II)
  10. UWP 流畅设计中的光照效果(容易的 RevealBorderBrush 和不那么容易的 RevealBackgroundBrush)...