Rails5の開発環境をDockernizeする(MySQL + Spring + Sidekiq + Redis + docker-sync)
年の瀬など関係なく過ごしております。
既存のRailsアプリの開発環境をDocker化する機会がありましたので、やったことを記録しておきます。
とは言っても、先人たちの知恵がかなり参考になりましたので、それを組み合わせて調整した程度の焼き直しです。
前提
docker-compose up
一発で開発環境構築が済むようにしたい- 本番環境のコンテナ化は別のDockerfile & docker-compose.ymlで行う
参考にしたページ(一部)
- 高速に開発できる Docker + Rails開発環境のテンプレートを作った
- 上記ページ内から以下2つの記事に言及されています
- 開発しやすいRails on Docker環境の作り方
- Railsアプリケーション開発を完全にDocker化する
とても参考になりました。ありがとうございます。
成果物
Dockerfile.dev
1 | FROM ruby:2.4.2 |
ポイント:
- nodeのインストール
- railsアプリでuglifierなどのExecJSが必要なgemをいくつか使っていますので、予めnodeをインストールしておきます
- yarnのインストール
- こちらも同様に、railsアプリ内で利用するnpmモジュールを
package.json
で管理しておりますので、予めyarnをインストールしておきます
- こちらも同様に、railsアプリ内で利用するnpmモジュールを
- ENTRYKITの活用
- 参考サイトそのままですが、ENTRYKITを活用することで、起動時に必要な処理(ここでは
bundle install
やyarn install
)などを完結に記述できます
- 参考サイトそのままですが、ENTRYKITを活用することで、起動時に必要な処理(ここでは
docker-compose.yml
1 | version: '2' |
ポイント:
railsコンテナのport 9292
config/puma.rb
内でSSL with オレオレ証明書を有効にしているので、ポートを空けています1
2
3
4
5
6if "development" == ENV.fetch("RAILS_ENV") { "development" }
ssl_bind '0.0.0.0', '9292', {
key: 'dev-cert/server.key',
cert: 'dev-cert/server.crt',
verify_mode: 'none'
}
各種データストア, bundle, node_modulesの永続化
- busybox imageを使って、永続化が必要なデータを隔離しています
- 新しいモジュールを追加しても、bundle installやyarn installの実行は短い時間で済みます
- springコンテナは不要だった
- 上記参考サイトにはspringコンテナが別途必要とのことだったのですが
bin/rails
やbin/rake
内にspringを読み込むコードがあれば、docker-compose exec rails rails c
でSpring preloader経由で呼び出されました - なぜだろう
- 上記参考サイトにはspringコンテナが別途必要とのことだったのですが
- worker / sidekiqコンテナ
- sidekiqを起動するために、別でコンテナを定義しています
- 今だったら、
version: 3
の記法で書いてもよかったかもしれない
docker-syncについて
docker-sync.yml
1 | version: "2" |
Docker for Macにはファイルシステムのパフォーマンス上の問題があるため、workaroundとして、次の2種類が有力です。
cached
オプションの使用 参考- volumeマウント時にどのレベルでファイルの一貫性を要求するか、というオプションが設定されました
- 設定して試してみましたが私の環境では大きな効果はなかったので、docker-syncを採用しました
docker-sync
- 上記の通り、docker-sync.ymlという設定ファイルに
rails-sync
という名前でdocker-sync用のvolumeを作成します - railsコンテナからは、
rails-sync
volumeをマウントします
1
2volumes:
- "rails-sync:/app"- 上記の通り、docker-sync.ymlという設定ファイルに
まとめ
こういう作業をすべてゼロからやっていたと思うと恐ろしいですが、先人の知恵のおかげで1日で快適な開発環境を手に入れることができました。
みなさまよいお年を。