docker-composeでデプロイする際に、RailsがDBプロセスの起動を待つようにする
はじめに
docker-composeでアプリをデプロイする際、pumaにせよunicornにせよ、Railsのアプリが立ち上がる前にデータベースが起動している必要があります。これはデータベースのコンテナが起動しているという意味ではなく、データベースのプロセスが立ち上がり、ポートが外部に向けて開放されており、他所から利用が可能になっている必要がある、ということでございます。
これを確認するための機構がdocker-composeにはありません。
実装
そこでwait-for-itと呼ばれるスクリプトを利用します。
これをdocker-compseのcommandから呼び出します。
docker-compose run web bin/wait_for_it db:3306 -- rake db:create
wait-for-itは特定のポートに対して、アクセスが可能であるか否かを判断するためのスクリプトです。そして、もしもアクセスが不可能であった場合、文字通りアクセスが可能になるのを待ってくれます。これを間に挟んでから、DBにアクセスすることで、望んだとおりの結果を得ることができます。