讓docker中的mysql啓動時自動執行sql

在用docker建立mysql容器的時,有時候咱們指望容器啓動後數據庫和表已經自動建好,初始化數據也已自動錄入,也就是說容器啓動後咱們就能直接連上容器中的數據庫,使用其中的數據了。mysql

其實mysql的官方鏡像是支持這個能力的,在容器啓動的時候自動執行指定的sql腳本或者shell腳本,咱們一塊兒來看看mysql官方鏡像的Dockerfile,以下圖:git

這裏寫圖片描述

已經設定了ENTRYPOINT,裏面會調用<font color="red">/entrypoint.sh</font>這個腳本,咱們把mysql:8這個鏡像pull到本地,再用docker run啓動起來,看看裏面的entrypoint.sh這個腳本的內容,有一段內容就是從固定目錄下遍歷全部的.sh和.sql後綴的文件,而後執行,以下圖:github

這裏寫圖片描述

搞清楚原理了,如今咱們來實踐一次吧:sql

在docker上搭建disconf環境時,須要搭建mysql數據庫,而且要依次執行四個sql文件分別對數據庫,表,數據作初始化,咱們有兩種作法:docker

  1. 將四個sql文件複製到/docker-entrypoint-initdb.d目錄下,這樣容器run的時候的時候就會自動執行這四個sql,可是從截圖的腳本上來看,對多個文件中的執行順序是不能指定的,若是建立數據庫的腳本晚於建立表的腳本執行,那麼就會致使建表失敗,因此這種複製sql的方式不能知足咱們的須要(不過,若是將四個文件按照順序合成一個sql就能知足要求了);
  2. 作一個sh文件,在裏面按咱們本身的須要來執行sql,內容以下:
#!/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
source $WORK_PATH/$FILE_0;
source $WORK_PATH/$FILE_1;
source $WORK_PATH/$FILE_2; 
source $WORK_PATH/$FILE_3;

看得出shell很簡單,登陸mysql並執行指定的sql文件,MYSQL_ROOT_PASSWORD,WORK_PATH,FILE_0這些都是環境變量。shell

再來看看對應的Dockerfile怎麼寫,以下:數據庫

# Docker image of disconf mysql
# VERSION 0.0.1
# Author: bolingcavalry

#基礎鏡像使用daocloud.io/library/mysql:8
FROM daocloud.io/library/mysql:8

#做者
MAINTAINER BolingCavalry <zq2599@gmail.com>

#定義工做目錄
ENV WORK_PATH /usr/local/work

#定義會被容器自動執行的目錄
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#定義sql文件名
ENV FILE_0 0-init_table.sql
ENV FILE_1 1-init_data.sql
ENV FILE_2 20151225.sql
ENV FILE_3 20160701.sql

#定義shell文件名
ENV INSTALL_DATA_SHELL install_data.sh

#建立文件夾
RUN mkdir -p $WORK_PATH

#把數據庫初始化數據的文件複製到工做目錄下
COPY ./$FILE_0 $WORK_PATH/
COPY ./$FILE_1 $WORK_PATH/
COPY ./$FILE_2 $WORK_PATH/
COPY ./$FILE_3 $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

0-init_table.sql,1-init_data.sql,20151225.sql,20160701.sql這四個文件就是咱們要執行的sql,在構造docker鏡像的時候被複制到鏡像文件中了;segmentfault

完整內容請clone個人github:git@github.com:zq2599/docker_disconf.git,clone完畢後進入裏面的mysql文件夾,在此文件夾下執行命令行docker build -t disconf_mysql:0.0.1 .構建鏡像;bash

再執行docker run –name mysqldisconf -e MYSQL_ROOT_PASSWORD=123456 -idt disconf_mysql:0.0.1啓動一個容器,再執行docker logs -f mysqldisconf查看容器日誌,以下圖紅框,能夠看到咱們寫入指定位置的sh文件已經被執行了:app

這裏寫圖片描述

咱們去數據庫裏看看數據是否是真的有了,執行docker exec -it mysqldisconf /bin/bash進入容器;

執行mysql -uroot -p123456登陸mysql後,操做以下圖:

這裏寫圖片描述

能夠看到,show databases,show tables,select * from app等操做均可以證實sql已經在容器建立後被自動執行,達到了咱們的目的。

歡迎關注個人公衆號

在這裏插入圖片描述

相關文章
相關標籤/搜索