Docker の公式 PostgreSQL イメージでの HEALTHCHECK 指定方法まとめ
Docker の公式 PostgreSQL イメージを使うときの HEALTHCHECK の指定方法についてまとめました。
各種バージョン・イメージが違うとあてはまらなくなることがあるので、参考にされる際はその点留意してください。
確認時の環境
対象イメージ
postgres(タグ:1413)
macOS
❯ sw_vers
ProductName: macOS
ProductVersion: 12.6
BuildVersion: 21G115Docker
❯ docker version
(省略)
Server: Docker Desktop 4.12.0 (85629)
(省略)❯ docker --version
Docker version 20.10.17, build 100c701❯ docker compose version
Docker Compose version v2.10.2公式 PostgreSQL イメージを使うときの HEALTHCHECK の指定方法
有用なコマンド
DB が起動しているかどうかのチェックだけでよければ、シンプルな pg_isready コマンドが便利です。
DB が起動していてなおかつ操作ユーザーが作成済みなどプラスアルファの条件をチェックしたい場合は psql コマンドを使います。
| コマンド | 使いどころ |
|---|---|
pg_isready |
DB が起動していることをチェックしたい |
psql |
DB が起動しているプラスアルファの条件をチェックしたい |
pg_isready を使う場合
先に結論ですが、最終形は次のようになります:
FROM postgres:14
HEALTHCHECK \
\
CMD pg_isready -U "${POSTGRES_USER:-postgres}" || exit 1結論に至るまでを以下順を追って説明しています。
pg_isready は引数なしで次のように使うことができます:
FROM postgres:14
HEALTHCHECK \
\
CMD ["pg_isready"]ただしこの形だと healthcheck 機能はうまく動きますが pg_isready コマンドが実行される度に次のメッセージがログに出力されるという問題があります( interval が短いとそれなりの頻度で出力されます):
role "root" does not existこのメッセージを出さないようにするにはオプション -U ( --username )を使って有効な DB ユーザー名を指定する必要があります:
FROM postgres:14
HEALTHCHECK \
\
CMD ["pg_isready", "-U", "postgres"]↑ の CMD 行の末尾の postgres は postgres:14 イメージのデフォルトの DB ユーザー名です。
postgres イメージでは環境変数 POSTGRES_USER を使って DB ユーザー名を変更できるようになっているので、 POSTGRES_USER を定義してユーザー名を変更した場合は pg_isready コマンドの引数もそれにあわせる必要があります。
CMD の後の部分を ["pg_isready", "-U", "postgres"] のような配列(= exec 配列)ではなく pg_isready -U postgres のような文字列(= shell コマンド)で指定するとその中で環境変数が使えるので POSTGRES_USER もそのまま使うことができます:
FROM postgres:14
HEALTHCHECK \
\
CMD pg_isready -U "${POSTGRES_USER:-postgres}"さらに、 Docker 公式ドキュメントによると HEALTHCHECK では実行されたコマンドの終了ステータスが次のとおり解釈されるのですが……
| ステータス | 解釈 |
|---|---|
0 |
success: コンテナは健康で使用可能である |
1 |
unhealthy: コンテナは正しく動いていない |
2 |
reserved: (使用しないこと) |
他方、 pg_isready の方は以下の終了ステータスを返すようになっています。
| ステータス | 意味合い |
|---|---|
0 |
接続受付中 |
1 |
接続拒否中(起動中など) |
2 |
レスポンスなし |
3 |
リクエスト未実施(パラメータ間違いなど) |
参考:
Exit Status
pg_isreadyreturns0to the shell if the server is accepting connections normally,1if the server is rejecting connections (for example during startup),2if there was no response to the connection attempt, and3if no attempt was made (for example due to invalid parameters).
そのため、厳密に HEALTHCHECK の仕様にあわせるには || exit 1 を末尾に追加する必要があるようです:
FROM postgres:14
HEALTHCHECK \
\
CMD pg_isready -U "${POSTGRES_USER:-postgres}" || exit 1pg_isready については以上です。
psql を使う場合
基本的には pg_isready と同様です。
s-c オプションで SQL 文を渡せるので、チェックしたい条件にあった SQL 文を渡して使えば OK です:
FROM postgres:14
HEALTHCHECK \
\
CMD psql -U "${POSTGRES_USER:-postgres}" -c "SELECT 1" || exit 1こちらも末尾に || exit 1 をつけておくとよさそうです。
参考:
Exit Status
psqlreturns0to the shell if it finished normally,1if a fatal error of its own occurs (e.g., out of memory, file not found),2if the connection to the server went bad and the session was not interactive, and3if an error occurred in a script and the variableON_ERROR_STOPwas set.