天天看點

Docker容器啟動時初始化Mysql資料庫

Docker容器啟動時初始化Mysql資料庫

鏡像下載下傳、域名解析、時間同步請點選

阿裡巴巴開源鏡像站

1. 前言

Docker在開發中使用的越來越多了,最近搞了一個Spring Boot應用,為了友善部署将Mysql也放在Docker中運作。那麼怎麼初始化 SQL腳本以及資料呢?

我這裡有兩個傳統方案。 第一種方案是在容器啟動後手動導入,太low了不行。第二種在Spring Boot用戶端連接配接Mysql容器時初始化資料庫,你可以參考使用flyway進行資料庫版本控制一文,但是這依賴用戶端的能力。能不能做到Mysql容器啟動時就自己初始化資料庫呢?當然可以!今天就來示範一下。全部代碼見文末。

2.原理

當Mysql容器首次啟動時,會在 /docker-entrypoint-initdb.d目錄下掃描 .sh,.sql,.sql.gz類型的檔案。如果這些類型的檔案存在,将執行它們來初始化一個資料庫。這些檔案會按照字母的順序執行。預設情況下它們會初始化在啟動容器時聲明的 MYSQL_DATABASE變量定義的資料庫中,例如下面的指令會初始化一個REGION_DB 資料庫:

Docker容器啟動時初始化Mysql資料庫

如果你的啟動指令沒有指定資料庫那麼就必須在資料庫DDL腳本中聲明并指定使用該資料庫。否則就會實作下面的異常:

Docker容器啟動時初始化Mysql資料庫

那麼接下來我們将利用這一機制來實作Docker容器啟動時初始化資料庫。

3.自定義Dockerfile

我們編寫自己的Dockerfile來實作我們的需求,這裡以 Mysql:5.7 為例。不同的版本可能有一定的出入,需要詳細去閱讀官方文檔。腳本如下:

Docker容器啟動時初始化Mysql資料庫
  • 第一步,引入官方 Mysql:5.7 Docker鏡像。
  • 第二步,無實際意義,主要是作者、組織資訊。
  • 第三步,很重要!本來我沒有配置第三行,結果運作容器後發現初始化資料的中文全部亂碼了。是以需要在初始化資料庫前修改Mysql的編碼等配置,這裡我順便把時區也改為了+8:00。
  • 第四步,複制包含資料庫腳本的 ./sql檔案夾到鏡像的/tmp/sql下。
  • 第五步,使用 mv 指令把第四步拷貝的檔案夾下的所有.sql檔案複制到 /docker-entrypoint-initdb.d下,這樣才能利用2.章節的機制進行初始化資料庫。
  • 第六步,删除使用過的臨時目錄。

然後你可以通過建構鏡像指令建構自定義的Mysql鏡像:

Docker容器啟動時初始化Mysql資料庫

通過mysql:5.7c鏡像啟動一個名稱為mysql-service的容器,root密碼為123456,并持久化資料到主控端 D:/mysql/data下:

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%' 檢視時區是否是東八區。

4. 總結

今天我們自定義一個可以執行初始化資料庫的Mysql鏡像,友善我們進行部署。你也可以參考這個思路來定制其它一些自己需要的Docker鏡像。

本文作者 | 碼農小胖哥

本文來自 |

掘金 提供全面,高效和穩定的鏡像下載下傳服務。釘釘搜尋 ' 21746399 ‘ 加入鏡像站官方使用者交流群。”