Docker初心者がRailsコンテナをHerokuへデプロイしてみる
はじめに
今回は前回構築した Rails コンテナを Heroku デプロイしてみたいと思います。
こちらの記事の続きになります。
実行環境
- macOS:Big Sur
- CPU:Intel
手順
- Dockerfile 変更
- database.yml 変更
- production.rb 変更
- Heroku にアプリケーション作成
- Heroku へデプロイ
Dockerfile 変更
Dockerfile で RAILS_ENV という環境変数をproductionにしてます。
これで Rails を本番環境に適用します。
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 を追加します。
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 箇所変更します。
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = true # false
assets 内のファイルを動的にコンパイル設定です。
ここではtrue
にしていますが、常に動的にコンパイルする必要がない場合はRails サーバー起動する前にコマンド実行してコンパイルする方が良いです。
# 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 をインストールされていない場合は公式サイトからインストールされてください。
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 にデプロイは未経験でしたので色々つまづきました。
一度できてしまうと難しくはないですし、コンテナでデプロイするメリットも大きいので良ければこちらの記事を参考にしてみてください。
参考資料
Discussion