Dockerでコンテナ化したrailsアプリをproductionモードで起動する

Dockerでコンテナ化したrailsアプリをproductionモード(本番環境)で起動する方法をメモします。

productionモードとして起動するには以下のような設定項目があります。

  • production用docker-compose.ymlを用意
  • DB設定ファイルの編集(config/database.yml)
  • secret_key_baseの準備
  • Gemfileの編集
  • DBのセットアップ
  • アセットのプリコンパイル

以下で一つずつ解説していきます。

production用docker-compose.ymlを用意

ファイル名をdocker-compose.prd.ymlとしてproduction用のdocker-compose設定ファイルを準備します。

version: '3'
services:
  ...
  app:
    ...
    # 以下を含める
    environment:
     RAILS_ENV: production
    ...


DBの設定

以下のように、config/database.ymlにproduction用にデータベースの設定を追記します。

production:
  <<: *default
  database: データベース名
  username: ユーザ名
  password: パスワード


secret_key_baseの準備

既にcredentials.yml.encが存在していれば、secret_key_baseは記述されているかと思うので内容を確認します。seret_key_baseはconfig/master.keyによって暗号化されているのでそのままでは中身を見ることはできないので以下を実行。

// コンテナ内に入る
$ docker exec -it コンテナID bash
(コンテナ内)> EDITOR="vim" bin/rails credentials:edit


EDITOR="vim"でエディターを指定します。もしvimの編集モードでファイルが開かずNew credentials encrypted and saved.とだけ返って来るようなら、コンテナにvimがないことが原因の場合があるのでvimをインストールします。(e.g. apt-get install vim)

credentials.yml.encが開ければ、以下のようにsecret_key_baseがあることを確認します。

# aws:
#   access_key_id: 123
#   secret_access_key: 345

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: キー


Gemfileの編集

以下のように、production環境のみで使いたいgem, またはtest/development環境のみで使うgemを含めないよう設定します。

group :production do
  gem 'xxx',
  gem 'yyy',
 ・・・
end


DBのセットアップ

docker-compose runコマンドで、rails db:setをproduction向けに実行します。appは各自のコンテナ名に置き換えてください。

$ docker-compose run app rails  db:setup RAILS_ENV=production
Creating docker_rails_app_run ... done
Created database 'prd_database'

$ docker-compose -f docker-compose.prd.yml exec app rails db:create
$ docker-compose -f docker-compose.prd.yml exec app rails db:migrate


アセットのプリコンパイル

静的ファイルをプリコンパイルをします。

$ docker-compose run app rails assets:precompile RAILS_ENV=production

ここまでできたら、docker-compose.prd.ymlを指定してproductionモードで起動してみます。

$ docker-compose -f docker-compose.prd.yml up --build