由于mysql5和mysql8版本的不同,导致构建镜像的时候存在一定的差异,在此将mysql8镜像的构建做一个总结。
本次总共用到了四个文件,分别是Dockerfile,setup.sh,my.sql,run.sh。
1.Dockerfile
Dockerfile是构建镜像必须的文件,需要注意的是第二次copy时必须放到"/docker-entrypoint-initdb.d"路径下,在这个路径下会自动执行相关脚本。具体内容如下:
FROM mysql:8
RUN mkdir -p /mysql
COPY my.sql /mysql
COPY setup.sh /docker-entrypoint-initdb.d
RUN chmod a+x /docker-entrypoint-initdb.d/setup.sh
2.setup.sh
这里就是去执行sql语句的。如下:
#!/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
source /mysql/my.sql;
3.my.sql
这里需要注意的是如果你的sql语句是从导出来的,那么需要在sql文件开头加两句话,因为导出来的sql语句是不包含创建数据源信息的,否则就会导致直接执行的时候出错。
CREATE DATABASE IF NOT EXISTS `my`;
USE `my`;
以下文件可以忽略,按照自己的sql语句添加即可,总的sql内容信息如下:
/*
Navicat MySQL Data Transfer
Source Server : 127.0.0.1_8899
Source Server Type : MySQL
Source Server Version : 80018
Source Host : 127.0.0.1:8899
Source Schema : my
Target Server Type : MySQL
Target Server Version : 80018
File Encoding : 65001
Date: 25/12/2019 13:50:49
*/
CREATE DATABASE IF NOT EXISTS `my`;
USE `my`;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for token
-- ----------------------------
DROP TABLE IF EXISTS `token`;
CREATE TABLE `token` (
`Token` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`TimeOutDate` datetime(0) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
4.run.sh
这个脚本文件是可以不用的,只是图个方便,自动执行docker的命令。
#!/bin/bash
echo "start build image ..."
docker build -t test .
echo "build success .."
sleep 3
echo "start run image ..."
docker run -e MYSQL_ROOT_PASSWORD=123456 -p 8899:3306 -d test
echo " success .."
最后在命令行运行:
sh run.sh