🚀

【Heroku】Docker によるデプロイの知見

2021/06/03に公開

はじめに

Docker を使って環境構築している Rails の Web アプリケーションを Heroku にデプロイする機会があったので、そのときに学んだ知見をここに残せたらと思います。

そもそもなぜ Heroku を採用したのか

最初は AWS を検討しましたが、新規事業で事業のフェーズとしてはまだまだ検証段階だったため、以下の理由で Heroku を採用しました。

  • 初期コストが低い
  • インフラ構築やデプロイが気軽

heroku.yml を使う

Docker イメージをビルドする際は、heroku.yml を使います。heroku.yml の実装方法は、Heroku Dev Center のドキュメントが非常に分かりやすいので詳細は割愛しますが、実装していて個人的にてこずったところを記載します。

https://devcenter.heroku.com/articles/build-docker-images-heroku-yml

stack を指定

Docker でデプロイする場合、stack の値を container にする必要があります。Heroku の stack の確認は以下のコマンドでできます。

$ heroku stack
=== ⬢ my-app Available Stacks
* container
  heroku-18
  heroku-20

stack の指定は以下のコマンドでできます。

$ heroku stack:set container

Stacks | Heroku Dev Center

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 ステートメントで環境変数を展開できません。これは少し不便だなと感じました。。

なのでビルド時の環境変数はARGENV 命令を使って定義する必要があります。

おわりに

Heroku は、インフラ構築やデプロイも気軽でコストも安く抑えられるので、事業のフェーズや要件によっては非常にいいサービスだと思います。

ただ実際に運用してみて、よくなかったところがあったり、また知見ができたら発信できればと思います。

参考

Discussion