由于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

Logo

更多推荐