監控 Service 是否存活也是 DevOps 重要的一環,此篇來紀錄在 Docker 內偵測 MySQL 或 Postgres 是否已經啟動。在 Docker 自動測試內,其中一步就是建立 Database 環境,底下為測試步驟:
測試步驟
- 啟動 Database 服務
- 執行 Database Migration
- 關閉 Database 服務
啟動 Database 服務
在 Docker 要啟動 Database 服務相當容易,底下分別為 MySQL 及 Postgres 啟動步驟# Postgres $ docker run --name some-postgres \ -d postgres:latest # MySQL $ docker run --name some-mysql \ -d -e MYSQL_ROOT_PASSWORD=1234 \ mysql:latest
偵測 Database 服務
透過 Docker exec 指令偵測 MySQL 及 Postgres 是否啟動,Postgres 透過pg_isready
指令,Mysql 則是使用 mysqladmin
# Postgres $ docker exec some-postgres pg_isready -h 127.0.0.1 127.0.0.1:5432 - accepting connections # MySQL $ docker exec some-mysql mysqladmin -uroot -p123 ping mysqld is alive # 或者是直接執行單一 SQL 語法 $ docker exec some-mysql mysql -uroot -p123 \ -e "SHOW Databases;"在 Docker 內如果是用
mysqladmin ping
的方式,我發現會抓不到 $?
錯誤代碼,所以還是建議用後者方式,透過執行單一 SQL 方式,在 HAProxy 搭配 Percona XtraDB Cluster 也是透過後者來偵測,詳情可以參考之前寫的『Percona XtraDB Cluster 搭配 HAProxy』。知道如何偵測後,就要寫 While 迴圈每一秒持續偵測。
while ! pg_isready -h postgres; do output "Database service is unavailable - sleeping" sleep 1 done完成上述偵測步驟,就可以正常執行 Databse Migration