🚀
【Heroku】Docker によるデプロイの知見
はじめに
Docker を使って環境構築している Rails の Web アプリケーションを Heroku にデプロイする機会があったので、そのときに学んだ知見をここに残せたらと思います。
そもそもなぜ Heroku を採用したのか
最初は AWS を検討しましたが、新規事業で事業のフェーズとしてはまだまだ検証段階だったため、以下の理由で Heroku を採用しました。
- 初期コストが低い
- インフラ構築やデプロイが気軽
heroku.yml を使う
Docker イメージをビルドする際は、heroku.yml
を使います。heroku.yml
の実装方法は、Heroku Dev Center のドキュメントが非常に分かりやすいので詳細は割愛しますが、実装していて個人的にてこずったところを記載します。
stack を指定
Docker でデプロイする場合、stack
の値を container
にする必要があります。Heroku の stack の確認は以下のコマンドでできます。
$ heroku stack
=== ⬢ my-app Available Stacks
* container
heroku-18
heroku-20
stack の指定は以下のコマンドでできます。
$ heroku stack:set container
Review Apps を使っている場合は、app.json
ファイルに stack の設定のコードを記載します。
app.json
{
"stack": "container"
}
Heroku 上に設定した環境変数の参照方法
heroku config:set
コマンドや Config Vars
に設定した環境変数は以下のように$環境変数
と記載することで参照できます。
heroku.yml
build:
docker:
web: Dockerfile
config:
NODE_ENV: production
RAILS_ENV: production
RAILS_MASTER_KEY: $RAILS_MASTER_KEY
SECRET_KEY_BASE: $SECRET_KEY_BASE
Docker による Heroku でのデプロイは RUN ステートメントで環境変数を使えない
Docker による Heroku のデプロイにおいて RUN ステートメントで環境変数を展開できません。これは少し不便だなと感じました。。
なのでビルド時の環境変数はARG
や ENV
命令を使って定義する必要があります。
おわりに
Heroku は、インフラ構築やデプロイも気軽でコストも安く抑えられるので、事業のフェーズや要件によっては非常にいいサービスだと思います。
ただ実際に運用してみて、よくなかったところがあったり、また知見ができたら発信できればと思います。
Discussion