咱們使用容器的方式部署數據庫組件,特別是企業有大量的項目開發業務的,部署的開發、測試數據庫組件較多時。常常會遇到如下問題:mysql
- 業務須要使用數據庫,但部署完數據庫後,須要在數據庫中執行建立schema的操做或者一些初始化數據的建立。
- 開發測試多套部署環境,須要屢次重複1的步驟。
- 項目比較多,時間久了項目須要的數據庫Schema不清楚。
- 項目交付時數據庫Schema管理混亂。
如今若是是使用Go等語言研發的業務系統,都具有了ORM層自動初始化和更新Schema的能力,若是是這樣本文對你無用。但目前大多數其餘開發語言的業務都不具有這種能力。git
若是咱們把數據庫也做爲一個業務中的一個服務模塊來管理的話,咱們但願服務啓動後便可直接完成Schema的初始化,直接提供數據服務能力。github
那麼在Rainbond中如何達成這樣的效果呢?sql
Schema初始化在傳統模式中通常有兩種方案:docker
- 在數據庫啓動後手動導入;人工經過客戶端操做,沒有自動化程度可言;
- 在業務服務啓動時鏈接數據庫進行初始化,依賴業務服務端的能力。
能夠看出,這兩種方式都存在各自的弊端,那麼有沒有方式可以讓數據庫啓動時自動初始化指定的數據呢?答案是 有!數據庫
咱們以MySQL爲例, 官方對於 Docker 有着良好的支持,首先來看 Dockerhub上 Mysql官方鏡像 的一段描述:bash
在數據庫容器首次啓動時,將建立一個指定名稱的新數據庫,並使用提供的環境變量對其進行初始化。 此外,它將執行在 /docker-entrypoint-initdb.d
中找到的擴展名爲 .sh
,.sql
和 .sql.gz
的文件。 文件將按字母順序執行。 默認狀況下,SQL文件將導入到MYSQL_DATABASE
變量指定的數據庫中。所以咱們只須要在Mysql鏡像工做機制的基礎上維護好數據庫初始化所須要的SQL便可。上文咱們說到把數據庫也做爲一個獨立的服務模塊,咱們也能夠經過代碼把Sql等腳步管理起來,劃分版本分支。架構
Rainbond 支持多種組件建立方式,在這裏咱們採用 從源碼建立組件 的方式,編寫 Dockerfile 並上傳至支持 Git/Svn
協議的客戶端,便可在平臺直接進行構建;這種方式 透明、可複用、而且可以進行自動化構建。app
目錄結構微服務
./ └── Dockerfile └── config ├── my.cnf ├── conf.d ├── docker.cnf └── sql ├── init_database └── README.md
Dockerfile文件
#基礎鏡像 FROM mysql:latest MAINTAINER Aaron <Aaron_ops@163.com> #把sql文件拷貝到/docker-entrypoint-initdb.d/目錄下,以便啓動時自動執行這個sql COPY ./sql/*.sql /docker-entrypoint-initdb.d #拷貝mysql配置文件 COPY ./config/ /etc/mysql/ #Mysql密碼 ENV MYSQL_ROOT_PASSWORD rainbond #數據持久化目錄 VOLUME [ "/var/lib/mysql" ] #端口 EXPOSE 3306
項目地址:https://github.com/Aaron-23/Initialize-db
使用該項目在平臺進行構建,Rainbond 將會自動檢測 Dockerfile 中定義的環境變量,存儲,端口等信息,對這些配置項進行自動化配置,在 Dockerfile 構建完畢後自動啓動數據庫。
須要注意的是 MySQL 屬於有狀態服務,因此在構建前需將組件類型修改成有狀態單實例,關於組件狀態請參考 組件部署類型。
啓動完成,進入運行中狀態
經過 Web終端 進入數據庫查看相關數據已經完成初始化
經過這種方式進行數據庫初始化,不須要修改程序代碼,無需藉助外部工具,經過平臺的能力快速部署數據庫並完成初始化,在後續使用過程當中能夠經過性能分析,資源監控,實例伸縮等功能完成服務運行時的全生命週期管理,提高開發效率,加強業務穩定性。
另外咱們還能夠將此組件發佈到 Rainbond 內部組件庫中,後續開發、測試和交付過程能夠直接一鍵安裝此組件便可得到數據初始完成的數據庫服務。
以上 MySQL數據庫 僅爲參考示例,MongoDB,PostgreSQL等數據庫均支持同類型數據初始化方式。
Rainbond 雲原生應用管理平臺,實現微服務架構不用改代碼,管理 Kubernetes 不用學容器,幫企業實現應用上雲,一站式將任何企業應用持續交付到 Kubernetes 集羣、混合雲、多雲等基礎設施。是 Rainstore 雲原生應用商店的支撐平臺。
本文做者:張震