Edited at

Rails on DockerをHerokuでDeployするまで


はじめに

Rails on DockerのアプリケーションをHerokuにデプロイするメモ。


前提

docker-compose.ymlの中身は以下の通り。ローカルではappとdbの2つのコンテナを作って開発してました。


docker-compose.yml

version: "3"

services:
db:
container_name: sample_db
image: postgres:11.5-alpine
volumes:
- ./tmp/db:/var/lib/postgresql/data

app:
container_name: sample_app
build: .
volumes:
- .:/app
depends_on:
- db
ports:
- 3000:3000


Rails用のappサービスとPostgreSQLをDBとして使うためのdbサービスを定義している。

Herokuでこの2つのコンテナを稼働させようと思ったけど、Herokuの制約でvolumeは使用できない(Herokuのfilesystemは一時領域)のでPostgreSQLはHerokuのadd-onsのものを利用する。

つまり、appサービスで定義しているコンテナをHerokuで起動させ、add-onsのPostgreSQLと接続されることでデプロイが完了する。今回のアプリケーションではDockerfileはappサービス側分しかないので、Herokuがいい感じにコンテナの管理もしてくれる。

また、Herokuのアカウント登録は完了している前提で書きます。

macでbrewコマンドが使えることも。


手順


  1. herokuコマンドのインストール

  2. heroku-cliにログイン

  3. Container Registryにログイン

  4. Herokuでアプリを新規作成

  5. Container Registryにdocker imageをpush

  6. Heroku add-onsのpostgresqlを作成

  7. webプロセスタイプをリリース

  8. DB migration

  9. 動作確認


herokuコマンドのインストール

詳細は公式サイトから。「The Heroku CLI | Heroku Dev Center

macの場合は

$ brew tap heroku/brew && brew install heroku

でインストールできます。


heroku-cliにログイン

以下のコマンドからHerokuにログインします。

$ heroku login

Logging in... done
Logged in as xxxxxxxxxx@sample.com

ブラウザに遷移するのでログインすればそのアカウントでheroku-cliを使えるようになります。


Container Registryにログイン

Container RegistryはHerokuでDockerイメージをデプロイするためのサービスです。まずはContainer Registryにログインします。

$ heroku container:login

Login Succeeded


Herokuでアプリを新規作成

heroku-cliからアプリを新規作成します。$ heroku create [app name]でアプリ名を指定するとそのアプリ名で作成されます(下記の例は"sample-app"というアプリ名にした場合)。アプリ名を指定しない場合はHerokuが適当につけてくれます。

$ heroku create sample-app

Creating ⬢ sample-app... done
https://sample-app.herokuapp.com/ | https://git.heroku.com/sample-app.git


Container Registryにdocker imageをpush

ローカルで作成したdocker imageをHerokuのContainer Registryにpushします。$ heroku container:push [process type]でpushできます。

$ heroku container:push web

process type(プロセスタイプ)はHerokuの中のアプリケーションの区切りみたいなものです。web process typeは予約語みたいなものでwebサーバーとして起動させるやつに割り振らねばなりません。

プロセスタイプの理解が弱くて、appを指定していてハマってました...

参考)Heroku Dynos - 設定 | Heroku


Heroku add-onsのpostgresqlを作成

前提で述べた通り、Herokuではvolumeを使えないのでadd-onsのpostgresqlをDBとして使うことが推奨されています。postgresql add-onsの詳細は「Heroku Postgres - Add-ons - Heroku Elements」に載っていますが、今回は無料のHobby Devを利用します。

$ heroku addons:create heroku-postgresql:hobby-dev


webプロセスタイプをリリース

5でpushしたwebプロセスタイプをdynoでリリースしてきます。

$ heroku container:release web


DB migration

通常のrailsアプリケーションと同様、db:migrateを事前に実行します。db:createはすでにされているらしい(addons:createの時点かな)。今回はseed_fuを使って初期データを投入したいのでそれも実施します。

$ heroku run rails db:migrate

$ heroku run rails db:seed_fu #seed_fuを使っている場合のみ


assets:precompile

production環境の場合、assetのプリコンパイルが必要です。

$ heroku run rails assets:precompile

これでアセットのプリコンパイルも完了。


動作確認

ここまででデプロイ完了です。動作確認してみます。

$ heroku open

ブラウザでアプリが見れたら成功です。

サンプルの成果はこちら --> hiradumi


Appendix

上記の手順だとRAILS_ENV=developmentでアプリが立ち上がっている状態です。

productionで立ち上げるためには

$ heroku config:add RAILS_ENV=production

で環境変数をセットします。

また、assets:precompileらへんのエラーが出てアプリが立ち上がらなくなったりした場合は、「Herokuで "is not present in the asset pipeline." が出るときの応急処置 - コネクト」などを参考にして応急処置を。


Reference