この記事は
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とかほとんど使わない説もありますが。。