在用docker创建mysql容器的时,有时候我们期望容器启动后数据库和表会自动构建,初始化数据也已自动录入,也就是说容器启动后我们就能直接连上容器中的数据库,使用其中的数据了。自动执行SQL这一过程存在于第一次使用镜像构建容器时,下一次restart容器时则不会存在等待其再次自动执行SQL的过程。
其实mysql的官方镜像是支持这个能力的,在容器启动的时候自动执行指定的sql脚本或者shell脚本,我们一起来看看MySQL官方的Dockerfile,如下图:
注意事项:官方加载该sh文件时指定了名字,也就是说,我们的sql启动脚本sh文件也得叫这个名字:docker-entrypoint.sh
首先给出项目结构图(使用IDEA):
首先给出SQL文件,一个创建数据库和表sakila-schema.sql,一个写入数据sakila-data.sql:
CREATE DATABASE `persontest` CHARACTER SET 'utf8';
use persontest;
CREATE TABLE `persontest`.`userinfo` (
`id` int(0) NOT NULL,
`username` varchar(255) NULL,
PRIMARY KEY (`id`)
);
INSERT INTO userinfo(id,username) VALUES(0,'CSDN yunlingfly');
INSERT INTO userinfo(id,username) VALUES(1,'dakl');
INSERT INTO userinfo(id,username) VALUES(2,'dhasjk');
创建docker-entrypoint.sh写入我们需要自动执行的SQL文件位置:
docker-entrypoint.sh:
#!/bin/bash
mysql -uroot -proot <
然后我们需要基于官方MySQL(官方镜像拉取太慢,这里我用的其他的镜像)构建一个自己的MySQL镜像,并在Dockerfile文件中将本地的SQL文件拷贝到镜像里去和指定一系列参数:
Dockerfile:
# 这个是构建MySQL的dockerfile
FROM registry.saas.hand-china.com/tools/mysql:5.7.17
# mysql的工作位置
ENV WORK_PATH /usr/local/
# 定义会被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
# 初始化数据库的SQL
ENV FILE_0 sakila-schema.sql
ENV FILE_1 sakila-data.sql
# 执行SQL
ENV INSTALL_DATA_SHELL docker-entrypoint.sh
COPY ./$FILE_0 $WORK_PATH/
COPY ./$FILE_1 $WORK_PATH/
#把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell
COPY ./$INSTALL_DATA_SHELL $AUTO_RUN_DIR/
#给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DATA_SHELL
# 设置容器启动时执行的命令
#CMD ["sh", "/docker-entrypoint-initdb.d/import.sh"]
编写一个启动脚本build.sh:
build.sh:
echo "开始打包..."
# 制作镜像:[TAG]
docker build -t mymysql:test ./mysql
编写一个开启容器的脚本start.sh:
start.sh:
#!/usr/bin/env bash
# Compose 是一个用户定义和运行多个容器的 Docker 应用程序。
# 在 Compose 中你可以使用 YAML 文件来配置你的应用服务。
# 然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务。
docker-compose up
编写docker-compose(这里我们才用了一个镜像,其实直接在脚本文件里写执行命令也行,有些大材小用,以后再写怎么使用docker-compose同时启动多个容器),注意docker-compose里不要写中文,注释可以写使用(例如# sometest),但不能用中文注释,否则会报错:
docker-compose.yml:
version: "2"
services:
mymysql:
image: mymysql:test
container_name: mymysql
ports:
- "3306:3306"
command: [
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci'
]
environment:
MYSQL_ROOT_PASSWORD: "root"
1 打开git bash,进入项目根目录,输入
$ ./build.sh
$ ./start.sh
差不多30s可以启动完成,另起一个bash输入docker logs mymysql看到如下说明启动完成:
使用Navicat测试是否成功导入数据,192.168.99.100这个IP是docker启动分配的默认IP,密码为设置的root:
已成功导入~
注意事项:如果出现中文乱码,可能是数据库的原因,也可能是docker镜像没有中文支持,这里不说明怎么调整了
最后给出我在github的本项目地址:https://github.com/Yunlingfly/docker-mysql.git