Docker-mysql启动时自动执行SQL

说明

在用docker创建mysql容器的时,有时候我们期望容器启动后数据库和表会自动构建,初始化数据也已自动录入,也就是说容器启动后我们就能直接连上容器中的数据库,使用其中的数据了。自动执行SQL这一过程存在于第一次使用镜像构建容器时,下一次restart容器时则不会存在等待其再次自动执行SQL的过程。

其实mysql的官方镜像是支持这个能力的,在容器启动的时候自动执行指定的sql脚本或者shell脚本,我们一起来看看MySQL官方的Dockerfile,如下图:

Docker-mysql启动时自动执行SQL_第1张图片

注意事项:官方加载该sh文件时指定了名字,也就是说,我们的sql启动脚本sh文件也得叫这个名字:docker-entrypoint.sh

快速开始

首先给出项目结构图(使用IDEA):

Docker-mysql启动时自动执行SQL_第2张图片

首先给出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看到如下说明启动完成:

Docker-mysql启动时自动执行SQL_第3张图片

使用Navicat测试是否成功导入数据,192.168.99.100这个IP是docker启动分配的默认IP,密码为设置的root:

Docker-mysql启动时自动执行SQL_第4张图片

Docker-mysql启动时自动执行SQL_第5张图片

已成功导入~

注意事项:如果出现中文乱码,可能是数据库的原因,也可能是docker镜像没有中文支持,这里不说明怎么调整了

最后给出我在github的本项目地址:https://github.com/Yunlingfly/docker-mysql.git

 

你可能感兴趣的:(Docker)