Docker在開發中使用的愈來愈多了,最近搞了一個Spring Boot應用,爲了方便部署將Mysql也放在Docker中運行。那麼怎麼初始化 SQL腳本以及數據呢?html
我這裏有兩個傳統方案。 第一種方案是在容器啓動後手動導入,太low了不行。第二種在Spring Boot客戶端鏈接Mysql容器時初始化數據庫,你能夠參考使用flyway進行數據庫版本控制一文,可是這依賴客戶端的能力。能不能作到Mysql容器啓動時就本身初始化數據庫呢?固然能夠!今天就來演示一下。所有代碼見文末。mysql
當Mysql容器首次啓動時,會在 /docker-entrypoint-initdb.d
目錄下掃描 .sh
,.sql
,.sql.gz
類型的文件。若是這些類型的文件存在,將執行它們來初始化一個數據庫。這些文件會按照字母的順序執行。默認狀況下它們會初始化在啓動容器時聲明的 MYSQL_DATABASE
變量定義的數據庫中,例以下面的命令會初始化一個REGION_DB
數據庫:spring
$ docker run --name some-mysql -e MYSQL_DATABASE=REGION_DB -d mysql:tag
複製代碼
若是你的啓動命令沒有指定數據庫那麼就必須在數據庫DDL腳本中聲明並指定使用該數據庫。不然就會實現下面的異常:sql
ERROR 1046 (3D000) at line 7: No database selected
複製代碼
那麼接下來咱們將利用這一機制來實現Docker容器啓動時初始化數據庫。docker
咱們編寫本身的Dockerfile來實現咱們的需求,這裏以 Mysql:5.7 爲例。不一樣的版本可能有必定的出入,須要詳細去閱讀官方文檔。腳本以下:數據庫
FROM mysql:5.7
LABEL OG=felord.cn COPY utf8mb4.cnf /etc/mysql/conf.d/utf8mb4.cnf COPY ./sql /tmp/sql RUN mv /tmp/sql/*.sql /docker-entrypoint-initdb.d RUN rm -rf /tmp/sql 複製代碼
+8:00
。./sql
文件夾到鏡像的/tmp/sql
下。mv
命令把第四步拷貝的文件夾下的全部.sql
文件複製到 /docker-entrypoint-initdb.d
下,這樣才能利用2.章節的機制進行初始化數據庫。而後你能夠經過構建鏡像命令構建自定義的Mysql鏡像:bash
# 必定不要忘記最後的一個 . 點
docker build -t mysql:5.7c .
複製代碼
經過mysql:5.7c
鏡像啓動一個名稱爲mysql-service
的容器,root密碼爲123456
,並持久化數據到宿主機 D:/mysql/data
下:spring-boot
docker run --name mysql-service -v d:/mysql/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7c
複製代碼
小貼士:你能夠經過
SHOW VARIABLES LIKE 'character%'
查看字符集是否更改成utf8mb4
,也能夠經過SHOW VARIABLES LIKE '%time_zone%'
查看時區是不是東八區。ui
今天咱們自定義一個能夠執行初始化數據庫的Mysql鏡像,方便咱們進行部署。你也能夠參考這個思路來定製其它一些本身須要的Docker鏡像。本文的完整Demo可經過我我的博客獲取。編碼
關注公衆號:Felordcn獲取更多資訊