目標
本番環境(production)でdockerを用いてrailsを動かす
実行内容
- docker-compose.prd.ymlの作成
- database.ymlの変更
- DBの作成
- アセットのプリコンパイル
- ビルド、起動
1. docker-compose.prd.ymlの作成
version: '3'
services:
db:
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_HOST_AUTH_METHOD: 'trust' #実際にデプロイする場合は使わない
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- ./tmp/db:/var/lib/postgresql/data
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
environment:
RAILS_ENV: production #これを追加する。
volumes:
- .:/app
- gem_data:/usr/local/bundle
ports:
- "3000:3000"
depends_on:
- db
volumes:
gem_data:
development環境で動かしていたdocker-compose.ymlとは別で、docker-compose.prd.ymlを作成しwebのenvironmentにはRAILS_ENV=productionを指定する。
また、productionとtestではdatabase.ymlのhost: dbを指定することができるがproductionではできないためとりあえずPOSTGRES_HOST_AUTH_METHOD: 'trust'を設定する。デプロイする際には環境変数を使って設定する。
2. database.ymlの変更
production:
<<: *default
adapter: postgresql
encoding: unicode
pool: 5
database: app_production
username: postgres
password: postgres
username, passwordにはdocker-compose.prd.ymlのPOSTGRES_USER,POSTGRES_PASSWORDの値を設定する。(デプロイの際は環境変数を用いる)hostはdocker-compose.prd.ymlでPOSTGRES_HOST_AUTH_METHOD: 'trust'を設定しているため特に設定しない。
3. DBの作成
docker-compose -f docker-compose.prd.yml run web rails db:create RAILS_ENV=production
-f docker-compose.prd.ymlをつけ忘れないように気を付ける。
docker-compose -f docker-compose.prd.yml run web rails db:migrate RAILS_ENV=production
4. アセットのプリコンパイル
docker-compose run web rails assets:precompile RAILS_ENV=production
本番環境の場合、アセットのプリコンパイルをしておかないと起動しない。
5. ビルドして起動
docker-compose -f docker-compose.prd.yml build
docker-compose -f docker-compose.prd.yml up
補足
development環境では読み込まれていた画像が表示されなかったりcssが適用されない,httpのメソッドがDELETEで指定しているのにGETでアクセスされているなどがあった場合 config/environments/production.rbで次のように変更する。
config.public_file_server.enabled = true
参考にしたサイト
Dockerでコンテナ化したrailsアプリをproductionモードで起動する
【初めての環境構築】Windows10にRails6+MySQL8.0+Dockerな環境を作ってみた
まとめ
改善点や間違っているところがあればぜひ意見をお願いします!