💭
curlコマンドでDBの起動完了を待ってからAPIサーバを実行する
docker-composeで例えばDBサーバ + APIサーバのような構成で複数サービスを起動する際に、DBの起動完了前にAPIサーバがDBにアクセスしてしまい、起動失敗する事があります。
これを回避するためにはDBに依存するサービス側でDBの起動が完了するまで待機してからプロセスを実行する必要があります。ncコマンドやwait-for-it.shなどのツールを使っている例が多い印象ですが、ほとんどのdocker imageに同梱されているcurlコマンドでも同様のことが行えるので、備忘録としてコマンドを記載しておきます。
until echo 'quit' | curl telnet://$MYSQL_HOST:$MYSQL_PORT >> /dev/null 2>&1; do echo "Waiting for db server..." && sleep 2 ; done
このコマンドはtelnetプロトコルでDBサーバーが起動し、指定されたポートでリッスンを開始するまで繰り返し接続を試み、サーバーが利用可能になるとループを終了します。
echo 'quit'
の部分は接続が確立された際にTelnetセッションを終了させるために'quit' 文字列を入力として渡しています
このコマンドをentrypointでプロセスの前に実行すると、DBの起動完了後にAPIサーバなどを起動できるようになります。
#/bin/bash
until echo 'quit' | curl telnet://$MYSQL_HOST:$MYSQL_PORT >> /dev/null 2>&1; do echo "Waiting for db server..." && sleep 2 ; done
# サーバ実行コマンドなど
exec "$@"
Discussion