スムーズなコンテナ運用!DockerでPostgreSQL起動を待つ賢いテクニック
DockerでPostgreSQLが起動するまで待機する方法
この方法は、主に以下の2つの方法で行うことができます。
docker-compose
は、複数のコンテナをまとめて定義および管理するためのツールです。docker-compose
を使用すると、PostgreSQLコンテナが起動する前に依存関係にある他のコンテナが起動するように設定できます。
以下の例では、web
サービスが postgres
サービスに依存していることを示しています。postgres
サービスが起動するまで web
サービスは起動されません。
version: "3.9"
services:
postgres:
image: postgres:14
ports:
- "5432:5432"
web:
image: my-web-app
depends_on:
- postgres
wait-for-postgres
は、PostgreSQLデータベースが利用可能になるまで待機するコマンドラインツールです。このツールを使用して、PostgreSQLコンテナが起動する前にアプリケーションスクリプトを実行することができます。
以下の例では、wait-for-postgres
ツールを使用して、PostgreSQLデータベースが利用可能になるまで app.sh
スクリプトを実行する方法を示しています。
wait-for-postgres --host postgres --database mydatabase
./app.sh
上記のいずれの方法を使用しても、DockerがPostgreSQLが起動するまで待機し、アプリケーションが確実にデータベースにアクセスできるようになります。
補足:
- 上記の例は、説明を簡潔にするために簡略化されています。実際の使用例では、追加の構成やオプションが必要になる場合があります。
docker-compose を使用する
version: "3.9"
services:
postgres:
image: postgres:14
ports:
- "5432:5432"
web:
image: my-web-app
depends_on:
- postgres
このコードは、docker-compose
を使用して postgres
サービスと web
サービスを定義します。postgres
サービスは web
サービスの依存関係として指定されているため、web
サービスは postgres
サービスが起動するまで起動されません。
wait-for-postgres ツールを使用する
wait-for-postgres --host postgres --database mydatabase
./app.sh
実行方法
docker-compose を使用する
- 上記のコードを
docker-compose.yml
ファイルに保存します。 - 以下のコマンドを実行して、
docker-compose
を使用してコンテナを起動します。
docker-compose up -d
wait-for-postgres ツールを使用する
- 以下のコマンドを実行して、
wait-for-postgres
ツールとapp.sh
スクリプトを実行します。
bash script.sh
注意事項
docker-compose
とwait-for-postgres
ツールの詳細については、それぞれの公式ドキュメントを参照してください。
- PostgreSQLのバージョンやポート番号を変更する必要がある場合は、コードをそれに応じて変更してください。
app.sh
スクリプトは、PostgreSQLデータベースを使用する任意のアプリケーションに置き換えることができます。
DockerでPostgreSQLが起動するまで待機するその他の方法
ヘッスチェックを使用する
Dockerコンテナには、コンテナの状態を監視するためのヘルスチェック機能が用意されています。PostgreSQLコンテナにヘルスチェックを設定することで、PostgreSQLが起動して使用可能になるまでDockerが待機するようにすることができます。
以下の例では、postgres
サービスにヘルスチェックを設定する方法を示しています。
version: "3.9"
services:
postgres:
image: postgres:14
ports:
- "5432:5432"
healthcheck:
test: ["CMD", "pg_isready", "-d", "mydatabase"]
interval: 5s
retries: 5
このコードでは、pg_isready
コマンドを使用してPostgreSQLが利用可能かどうかを5秒間隔で5回チェックします。
シェルスクリプトを使用して、PostgreSQLが起動するまで待機してからアプリケーションを起動することができます。
以下の例では、wait-for-postgres
ツールに似た機能を持つシェルスクリプトを作成する方法を示しています。
#!/bin/bash
host="$1"
database="$2"
timeout="$3"
while ! pg_isready -h "$host" -d "$database" >/dev/null 2>&1; do
if [[ $timeout -le 0 ]]; then
echo "Timed out waiting for PostgreSQL to start"
exit 1
fi
echo "Waiting for PostgreSQL to start..."
sleep 1
timeout=$((timeout - 1))
done
echo "PostgreSQL is ready!"
このスクリプトは、ホスト名、データベース名、およびタイムアウト時間を受け取ります。スクリプトは、pg_isready
コマンドを使用してPostgreSQLが利用可能になるまで指定された時間待機します。
独自のツールを使用する
上記の方法に加えて、独自のツールを作成して、DockerでPostgreSQLが起動するまで待機することもできます。
ヒント:
- 複数のPostgreSQLコンテナを使用する場合は、各コンテナに個別の待機メカニズムを設定する必要があります。
- 複雑なアプリケーションを使用する場合は、より高度な待機戦略が必要になる場合があります。
postgresql docker