Heroku Container Registryとは
Herokuで簡単にDockerコンテナを実行できるサービスです。
heroku container:push
というコマンドでDockerfileイメージをレジストリへビルド&プッシュ、そして
heroku container:release
コマンドでプッシュしたイメージを本番環境へ反映させます。
以前書いた 自動テスト〜自動デプロイまでをDockerコンテナで実行する方法
では上手く行かなかったりしますのでメモを残しておきます
また上記記事ではdocker-composeを利用していますが
heorku containerではDockerfileしか使っていないぽいので
docker-composeは開発、テスト環境でのみの実行でした。
Railsアプリのそのままデプロイすると実は上手く行かない
Dockerコンテナで動作するように作ったRailsアプリをそのまま
container:push、container:releaseしても上手く動作しなかったりします。
いくつか要因があります。
原因1: development環境で動作している
実はRAILS_ENVが空になっていてdevelopment環境で動作していたりします。
普通にRailsアプリをherokuへプッシュすると自動的に環境変数を設定してくれているので
意識することは無いので見落としていたりします。
RAILS_ENV=productionで環境変数をセットしましょう。
heroku config:setでセットするのが一番簡単だと思います。
(heroku configをコンテナ内へ渡してくれています)
原因2: master.keyをセットしていない
原因1を解決すると今度はこちらの問題が浮上します。
RailsアプリではCookieの改ざん防止にsecret_key_baseという値を使用していますが
こちらはdevelopment, およびtest環境ではこの値が無くても勝手にいい感じに動作してくれます。
ですがproduction環境ではこの値が必要になります。
こちらもcontainerでは無い方のherokuへのデプロイでは自動的に設定してくれますので見落としている可能性があります。
また、Rails5.2以降ではsecret_key_baseはcredentialsファイルのなかに格納されており
これを開くためにmaster.keyの値が必要です。
これはgit管理から外されていると思いますので環境変数RAILS_MASTER_KEYとしてセットしておきましょう。
上記2つで本番環境で無事コンテナが動作しました。
初心者らしくherokuでデプロイしていたのですが知識不足が露呈してしまっているので
勉強も兼ねてEC2などを経験してみる方が良さそうですね。