Help us understand the problem. What is going on with this article?

メモ:Docker上でRailsを動かす時の初期化処理どうする?

More than 1 year has passed since last update.

この記事は

FargateとかeksとかいよいよAWSもDocker全開になってきていいかげんちゃんとサーバで動くDockerfileを模索していた時に、Railsの各種初期化をどうするんだろうと迷った時のメモです

初期化処理諸々

Gemのインストール(bundle install)

  • bundle installはシンプルにビルド時に実行すればOKです
Dockerfile
RUN \
  gem install bundler && \
  echo 'gem: --no-document' >> ~/.gemrc && \
  cp ~/.gemrc /etc/gemrc && \
  chmod uog+r /etc/gemrc && \
  bundle config --global jobs 4 && \
  bundle install && \
  rm -rf ~/.gem

DBスキーマの作成

  • ECSの場合RDSを使うと思うので、そもそも考慮不要です

DBマイグレーション

  • rake db:migrateはDBが起動していないといけないので、ビルド時には実行不可能です
  • 悩みましたがコンテナ起動時にどさくさでmigrationも毎回かけてしまうことにしました
    • ChefベースのOpsworksの標準Railsテンプレートもそんな動きになってた気がするし
Dockerfile
ENTRYPOINT bundle exec rake db:migrate && \
    bundle exec unicorn_rails -E production -c config/unicorn.rb -D && \
    /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

asset precompile

  • docker build時にまとめて実行したいところなのですが、rake assets:precompileは動かないというジレンマが・・・
    • これもビルド中はDBサーバが存在しないという制約によります
  • 色々調べていたらThe NullDB Connection Adapter PluginというActiveRecordのモックアダプタを発見、これでいけることがわかりました
Gemfile
gem 'activerecord-nulldb-adapter'
Dockerfile
RUN bundle exec rake assets:precompile DATABASE_URL=nulldb://localhost

終わりに

  • rake assets:precompileとかはそもそもDBに繋がない仕様にしてほしい気がしますね
  • フロントはyarn/reactでSPAみたいな潮流だからもうasset pipelineとかほとんど使わない説もありますが。。
shouta-dev
Railsが大好き!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away