使用docker-compose啟動服務時,初始化資料庫和資料(以Mysql為例)
以往大家在使用docker-compose時,只要設定yml服務參數(如下設定),然後輸入docker-compose up,容器內就會產生一個該映像檔的服務
version: "3"
services:
db:
image: mysql/mysql-server:5.7
restart: always
environment:
MYSQL_USER: test
MYSQL_PASSWORD: test
MYSQL_ROOT_PASSWORD: test
MYSQL_DATABASE: testdb
ports:
- 3306:3306
但是對於剛學習docker的人來說,為了測試docker其他功能與參數調整,會不斷的docker-compose up、down、up、down、up、down、up、down
由於只要docker-compose down後,docker會直接刪除container,此時想要再啟動docker-compose內的服務,就會一切回歸到最初的感動,抱歉,是回到最原始的模樣
為了使每次服務建構時,資料庫裡面就自動創建(或保存)好對應資料,有兩個方向可以著手研究
1.docker-compose down時,想辦法讓資料不要自動清除,沒錯,關鍵字就是volumes
我們可以設定docker-compose volumes使資料持久化,volumes 讓你處理資料共享與資料持久(persist),有關volumes更多的介紹
不過當服務越來越多,若是每個服務都掛出volumes,這時候若須備份以及轉移主機和快速部屬,要攜帶每個volumes就不太符合docker輕量容器化的目標了
2.docker-compose up時,設定自動執行sql檔案(本文目的)
在docker hub搜尋mysql映像檔時,可以清楚看到Description內Initializing a fresh instance標題
由此說明可知,官方映像檔已經有定義出如何初始化資料庫的規格,我們只要實現他就好
著手進行步驟:
由於mysql image自己就有定義一個docker-entrypoint-initdb.d資料夾是在資料庫初始化就執行的資料夾,有兩個方法可以在初始化就掛載檔案進去
第一個方法是使用volumes掛載進去給docker-entrypoint-initdb.d資料夾需要執行的sql或sh檔案
第二個方法是自製images,用command line透過CP指令直接複製至images裡面的docker-entrypoint-initdb.d資料夾
以下兩種方法都會實作給各位參考
第一個方法
1. 首先先創建一個資料夾,暫定名稱為sqls,把我們需要初始化的sql檔案丟進去
2. 在同目錄底下,新增一個docker-compose.yml檔案,並輸入以下參數內容
version: "3"
services:
db:
image: mysql/mysql-server:5.7
restart: always
environment:
MYSQL_PASSWORD: test
MYSQL_ROOT_PASSWORD: test
ports:
- 3306:3306
volumes:
- ./sqls:/docker-entrypoint-initdb.d
3. 此時再輸入docker-compose up,查看該服務的log就可以發現
這個映像檔就會自己幫我們啟動放在sqls資料夾裡面的.sql檔案,而當停止容器後再啟動會發現並不會再啟動一次,所以可以達到我們初始化資料庫的目標
第二個方法
1. 一樣先創建一個資料夾,暫定名稱為sqls,把我們需要初始化的sql檔案丟進去
2. 新增一個Dockerfile檔案,並輸入以下參數內容
FROM mysql/mysql-server:5.7
COPY ./sqls/init.sql /docker-entrypoint-initdb.d/init.sql
參數解釋:
FROM (指定這個映像檔需要以哪一個映像檔為基底)
COPY (複製本地端的檔案/目錄到映像檔的指定位置中)
3. 新增一個docker-compose.yml,並輸入以下參數內容,這裡需要把原本為Image的參數設定成build,選擇用我們剛剛自製的image
version: "3"
services:
db:
build: .
restart: always
environment:
MYSQL_PASSWORD: test
MYSQL_ROOT_PASSWORD: test
ports:
- 3306:3306
此時檔案的目錄會呈現下列狀態
4. 輸入docker-compose up,查看該服務的log就可以發現
一樣有初始化我們複製給image的sql檔案,是不是很簡單呢?
結語: 使用docker可以讓服務很迅速的建構起來,不必再擔心換了一台電腦就需要重新安裝大大小小的軟體,而且輕量化的容量是使攜帶非常方便,再也不用備份大量的資料,對於開發者來說真的是一大福音
參考連結:
1.docker volumes: https://docs.docker.com/compose/compose-file/#volume-configuration-reference
2.docker hub (mysql): https://hub.docker.com/_/mysql
3.docker file: https://docs.docker.com/engine/reference/builder/
太強辣