📘

Docker初心者がRailsコンテナをHerokuへデプロイしてみる

2022/10/12に公開

はじめに

今回は前回構築した Rails コンテナを Heroku デプロイしてみたいと思います。
こちらの記事の続きになります。
https://zenn.dev/takuty/articles/6f7afabca322d1

実行環境

  • macOS:Big Sur
  • CPU:Intel

手順

  1. Dockerfile 変更
  2. database.yml 変更
  3. production.rb 変更
  4. Heroku にアプリケーション作成
  5. Heroku へデプロイ

Dockerfile 変更

Dockerfile で RAILS_ENV という環境変数をproductionにしてます。
これで Rails を本番環境に適用します。

Dockerfile
FROM ruby:3.1.2

# ここを追加[Rails環境を本番環境にする]
ENV RAILS_ENV=production

# データベース用にPostgreSQLをインストール
RUN apt-get update -qq && apt-get install -y postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN gem update --system 3.3.20 && bundle install
COPY . /myapp

# コンテナ起動時に実行させるentrypoint.shを追加
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Rails サーバ起動
CMD ["rails", "server", "-b", "0.0.0.0"]

database.yml 変更

Dockerfile でproductionという本番環境を追加したのでデータベースの方も production を追加します。

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: db
  username: postgres
  password: password

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

# ここを追加[本番環境DB設定]
production:
  <<: *default
  database: myapp_production

production.rb 変更

静的ファイル関連の設定を 2 箇所変更します。

config/environments/production.rb
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = true # false

assets 内のファイルを動的にコンパイル設定です。
ここではtrueにしていますが、常に動的にコンパイルする必要がない場合はRails サーバー起動する前にコマンド実行してコンパイルする方が良いです。

config/environments/production.rb
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = true # ENV["RAILS_SERVE_STATIC_FILES"].present?

public 内の静的ファイルへのアクセスを許可します。

Heroku アプリケーション作成

ここではHerokuCLIを使用して Heroku アプリケーションを操作していきます。

お使いの環境に HerokuCLI をインストールされていない場合は公式サイトからインストールされてください。
https://devcenter.heroku.com/ja/articles/heroku-cli

Heroku へログイン

Heroku への操作をするためにログインします。

$ heroku login
# AWS等のクラウド環境の場合
$ heroku login -i

Heroku へコンテナを登録するためにコンテナレジストリにログインします。

$ heroku container:login

Heroku アプリケーション作成

以下コマンドでアプリケーション作成します。

$ heroku create <アプリ名>

データベース設定

次に作成したアプリケーションにデータベースを作成します。
database.ymlで postgresql を指定したので以下コマンドで postgresql をインストールします。

$ heroku addons:create heroku-postgresql:hobby-dev -a <アプリ名>

「hobby-dev」では heroku の postgresql プランの中で無料プランを指定しています。

Heroku へデプロイ

まず事前に起動しているコンテナを停止させます。

$ docker-compose down

Heroku へコンテナを以下コマンドでデプロイします。

$ heroku container:push web -a <アプリ名>
$ heroku container:release web -a <アプリ名>

デプロイが完了したら postgresql にデータベースを作成します。

$ heroku run bundle exec rake db:migrate RAILS_ENV=production -a <アプリ名>

ここまでで動作しているはずなので以下コマンドでアプリケーションを開いてみます。

$ heroku open -a <アプリ名>

まとめ

Rails アプリケーションをコンテナで Heroku にデプロイは未経験でしたので色々つまづきました。
一度できてしまうと難しくはないですし、コンテナでデプロイするメリットも大きいので良ければこちらの記事を参考にしてみてください。

参考資料

https://programmingmemo.com/docker-rails-heroku/
https://qiita.com/fuku_tech/items/dc6b568f7f34df10cae7

GitHubで編集を提案

Discussion