在 Docker 偵測 MySQL 或 Postgres 是否啟動

Screen Shot 2016-06-11 at 6.58.22 PM 監控 Service 是否存活也是 DevOps 重要的一環,此篇來紀錄在 Docker 內偵測 MySQLPostgres 是否已經啟動。在 Docker 自動測試內,其中一步就是建立 Database 環境,底下為測試步驟:

測試步驟

  • 啟動 Database 服務
  • 執行 Database Migration
  • 關閉 Database 服務
但是在 Docker 啟動 Database 服務後,如果直接執行 Migration,會遇到 Database 尚未啟動,所以造成 Database Migration 失敗,這也是本篇要教大家如何偵測 MySQL 或 Postgres 是否啟動。

啟動 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 Screen Shot 2016-06-11 at 2.04.02 PM