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

この記事は

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とかほとんど使わない説もありますが。。
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.