1. 程式人生 > >Docker-mysql啟動時自動執行SQL

Docker-mysql啟動時自動執行SQL

說明

在用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 <<EOF
source /usr/local/sakila-schema.sql;
source /usr/local/sakila-data.sql;

然後我們需要基於官方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映象沒有中文支援,這裡不說明怎麼調整了