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

搭建步骤

1、首先创建Dckerfile:

FROM mysql:5.7

#设置免密登录
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes #将所需文件放到容器中
COPY setup.sh /mysql/setup.sh
COPY schema.sql /mysql/schema.sql
COPY privileges.sql /mysql/privileges.sql #设置容器启动时执行的命令
CMD ["sh", "/mysql/setup.sh"]

2、编写容器启动脚本setup.sh:

#!/bin/bash
set -e #查看mysql服务的状态,方便调试,这条语句可以删除
echo `service mysql status` echo '1.启动mysql....'
#启动mysql
service mysql start
sleep
echo `service mysql status` echo '2.开始导入数据....'
#导入数据
mysql < /mysql/schema.sql
echo '3.导入数据完毕....' sleep
echo `service mysql status` #重新设置mysql密码
echo '4.开始修改密码....'
mysql < /mysql/privileges.sql
echo '5.修改密码完毕....' #sleep
echo `service mysql status`
echo `mysql容器启动完毕,且数据导入成功` tail -f /dev/null

这里是先导入数据,然后才是设置用户和权限,是因为mysql容器一开始为免密登录,Dockerfile中有如下设置:ENV MYSQL_ALLOW_EMPTY_PASSWORD yes,此时执行导入数据命令不需要登录验证操作,如果是先执行权限操作,那么导入数据则需要登录验证,整个过程就麻烦了许多。

3、需要导入数据的mysql脚本命令schema.sql:

-- 创建数据库
create database `docker_mysql` default character set utf8 collate utf8_general_ci; use docker_mysql; -- 建表
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` (
`id` bigint() NOT NULL,
`created_at` bigint() DEFAULT NULL,
`last_modified` bigint() DEFAULT NULL,
`email` varchar() DEFAULT NULL,
`first_name` varchar() DEFAULT NULL,
`last_name` varchar() DEFAULT NULL,
`username` varchar() DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- 插入数据
INSERT INTO `user` (`id`, `created_at`, `last_modified`, `email`, `first_name`, `last_name`, `username`)
VALUES
(,,,'john.doe@example.com','John','Doe','user');

因为是测试,所以随便写了一个建表语句,如果是真实项目肯定不止这一张表,直接将建表语句覆盖过来就好。

4、mysql权限设置命令privileges.sql:

use mysql;
select host, user from user;
-- 因为mysql版本是5.,因此新建用户为如下命令:
create user docker identified by '';
-- 将docker_mysql数据库的权限授权给创建的docker用户,密码为123456:
grant all on docker_mysql.* to docker@'%' identified by '' with grant option;
-- 这一条命令一定要有:
flush privileges;

5、创建镜像

docker build -t docker-mysql-init-data .

docker build 为创建镜像命令,名称为docker-mysql-init-data,'.'表示当前目录,即Dockerfile文件所在的目录

$ docker build -t docker-mysql-init-data .
Sending build context to Docker daemon .144kB
Step / : FROM mysql:5.7
5.7: Pulling from library/mysql
fc7181108d40: Already exists
787a24c80112: Pull complete
a08cb039d3cd: Pull complete
4f7d35eb5394: Pull complete
5aa21f895d95: Pull complete
a742e211b7a2: Pull complete
0163805ad937: Pull complete
62d0ebcbfc71: Pull complete
559856d01c93: Pull complete
c849d5f46e83: Pull complete
f114c210789a: Pull complete
Digest: sha256:c3594c6528b31c6222ba426d836600abd45f554d078ef661d3c882604c70ad0a
Status: Downloaded newer image for mysql:5.7
---> a1aa4f76fab9
Step / : ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
---> Running in 7ef903100274
Removing intermediate container 7ef903100274
---> e0b13ef4cdea
Step / : COPY setup.sh /mysql/setup.sh
---> e3e3d110e677
Step / : COPY schema.sql /mysql/schema.sql
---> a518ec11da67
Step / : COPY privileges.sql /mysql/privileges.sql
---> 3122063dfdd5
Step / : CMD ["sh", "/mysql/setup.sh"]
---> Running in 8f551037fa01
Removing intermediate container 8f551037fa01
---> 8fb5362648b9
Successfully built 8fb5362648b9

6、找到生成的镜像,启动容器

$ docker run -p : -d docker-mysql-init-data

查看日志

$ docker logs bc4lcbc9ansba
MySQL Community Server 5.7. is not running.
.启动mysql....
--08T03::.131210Z [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
--08T03::.331141Z [Warning] InnoDB: New log files created, LSN=
--08T03::.355405Z [Warning] InnoDB: Creating foreign key constraint system tables.
--08T03::.414068Z [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 91ddb324-a133-11e9-9a7c-0242ac110002.
--08T03::.415870Z [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
--08T03::.416972Z [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
..
MySQL Community Server 5.7. is started.
MySQL Community Server 5.7. is running.
.开始导入数据....
.导入数据完毕....
MySQL Community Server 5.7. is running.
.开始修改密码....
host user
localhost mysql.session
localhost mysql.sys
localhost root
.修改密码完毕....
MySQL Community Server 5.7. is running.
/mysql/setup.sh: : /mysql/setup.sh: mysql容器启动完毕,且数据导入成功: not found

dockerfile运行mysql并初始化数据的更多相关文章

  1. Docker-compose封装mysql并初始化数据以及redis

    一.概述 现有一台服务器,需要部署mysql和redis.其中mysql容器,需要在第一次启动时,执行sql文件. redis保持空数据即可. 关于Docker-compose的安装,请参考连接: h ...

  2. centos7使用Dockerfile运行mysql库并初始化数据

    Dockerfile文件(文件名一定要这个) FROM mysql:5.7 WORKDIR /docker-entrypoint-initdb.d ENV LANG=C.UTF-8 ADD test. ...

  3. 使用Dockfile构建mysql镜像与初始化运行mysql容器

    使用docker 构建mysql镜像,并在容器初次创建时初始化数据 Dockerfile FROM mysql:5.7.23 MAINTAINER gradyjiang "jiangzhon ...

  4. 在mysql数据库中创建oracle scott用户的四个表及插入初始化数据

    在mysql数据库中创建oracle scott用户的四个表及插入初始化数据 /* 功能:创建 scott 数据库中的 dept 表 */ create table dept( deptno int ...

  5. 使用docker容器运行MySQL数据库并持久化数据文件

    1.下载mysql镜像 # docker pull mysql 2.启动mysql容器 # docker run -itd -v /data:/var/lib/mysql -p 33060:3306 ...

  6. 支持初始化数据的Zookeeper Docker镜像

    最近在做一个演示项目 https://github.com/cnscud/cavedemo, 自然为了方便, 也做了docker打包, 发现zookeeper的镜像没有导入初始化数据的功能, 于是自己 ...

  7. Vusual C++连接Mysql和从MySql中取出数据的API介绍

    .1 mysql_real_connect() 2.1.1 函数原型: MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const ...

  8. 在docker中运行mysql实例

    Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机.下图是容器跟虚拟机的对比 对docker有个大致了解,学习docker断断续续,虽说学习不能急于求成,但断断续续学的话,浪费的碎片化 ...

  9. 利用Ajax实现数据的同步传输,从mysql中提取数据,通过echarts可视化

    如何将mysql数据库中的方式通过echarts可视化呢,以下面这个简单的例子向大家进行演示:   步骤一:mysql的创表和插入数据,当然这些数据也可以是你通过爬虫抓取的.     步骤二:   创 ...

随机推荐

  1. SpringCloud2.0 Hystrix Dashboard 断路器指标看板 基础教程(八)

    1.启动基础工程 1.1.启动[服务中心]集群,工程名称:springcloud-eureka-server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) ...

  2. ARTS-week1

    Algorithm 小A 和 小B 在玩猜数字.小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜.他们一共进行三次这个游戏,请返回 小A 猜对了几次? 输入的 ...

  3. 《The One 团队》:第九次团队作业:BETA冲刺与团队项目验收

    项目 内容 作业所属课程 所属课程 作业要求 作业要求 团队名称 < The One !> 作业学习目标 (1)掌握软件黑盒测试技术:(2)学会编制软件项目总结PPT.项目验收报告:(3) ...

  4. danci4

    advantage 英 [əd'vɑːntɪdʒ] 美 [əd'væntɪdʒ] n. 优势:利益:有利条件 vi. 获利 vt. 有利于:使处于优势 lack 英 [læk] 美 [læk] vt. ...

  5. centos7部署etcd集群

    实验环境:centos7.4纯净版 192.168.216.130 node1 master 192.168.216.132 node2 slave 192.168.216.134 node3 sla ...

  6. Python编写的ssh客户端[类似putty]

    转载请注明出处:http://blog.csdn.net/jmppok/article/details/17588381 windows下可以通过putty以ssh方式连接linux主机.但putty ...

  7. zabbix显示 get value from agent failed:cannot connetct to xxxx:10050:[4] interrupted system call

    在阿里云上部署的两台云主机,从server上 agent.ping不通agent10050端口,在agent上使用firewalld-cmd 添加了10050端口还不行,关闭了防火墙和selinux也 ...

  8. canvas的基本使用

    一.定义 canvas最早是由Apple引入Webkit的,<canvas>元素包含于HTML5中 HTML5的canvas元素使用JavaScript在网页上绘制图像,画布是一个矩形区域 ...

  9. 2019SDSC夏令营游记

    Day 1 2019.7.22 晴 第一天夏令营,是在一所大学举办的. 到之前的我好兴奋,要提前看一下大学到底是什么样的. 聊了一上午的天 坐了一上午的公交终于到了目的地,下午很自由,自己在宿舍里面休 ...

  10. php在Linux下的相对路径问题

    如图所示,我在 /root/phpcode/ 下面有两个php文件. a.php 与 b.php,我用 a.php 去 require b.php ,然后 b.php 输出 1. 现在我在 /root ...