railsのdocker開発環境をつくってて躓いたメモ
前提
扱っているプロジェクトが増えてきて、
また個人用のPCはLinuxにしていちいちそれぞれの開発環境を整えるのが面倒になってきたので、
docker-compose up
さえすれば動く状態にしたかった。
いろいろ格闘したので備忘録
環境
- docker for mac
- docker-compose
dockerコンテナで使うもの
↑今回の話にあんまり関係ないかも
躓いたところ
1. docker for macおそすぎ問題
Docker for Macは遅いらしい。
ボリュームにマウントするあたりがかなりLinux版と比べて遅いらしい。
解決策:
Docker for Mac Edgeをインストールした。
Edge版はここのページ中盤のGet Docker CE for Mac(Edge)からダウンロードできる。
注意
既存のDocker for Macで作ったイメージとコンテナが全部消えるので、多少面倒。
消えるのか、認識されなくなってディスク上には残るのか知らないので一応ゴミファイルにならないように全消ししてからedge版を入れるのをオススメします。
2. .bundler をボリュームにマウントしようとするとちょっと面倒
ローカルにもdockerを使わずに生の開発環境を用意してしまった場合、
$ bundle install --path vendor/bundle
等すると、
.bundle/config
に
--- BUNDLE_PATH: "vendor/bundle"
が書き込まれてしまい、
これを↓みたいにインストールして docker-compose.yml
でマウントしていると、
docker/dockerfile.dev
RUN bundle check --path .bundle || bundle install -j4 --path .bundle
docker-compose.yml
web: build: context: . dockerfile: ./docker/dockerfile.dev ports: - "3000:3000" volumes: - .:/rails_app - bundle:/rails_app/.bundle - /rails_app/.git - /rails_app/tmp - /rails_app/log - /rails_app/vendor volumes: bundle: driver: local
bundlerのパス指定は vendor/bundle
だけど実際には .bundle
にインストールされているので困る。
解決策:
1. docker環境はパス指定しない docker環境なんだしグローバルにインストールしてもいいよね、ということで。
2.
docker-compose.yml
でパス指定を無理やり変えるRUN bundle install
している部分より下で、
RUN sed -ie "/BUNDLE_PATH:/d" .bundle/config &&\ echo BUNDLE_PATH: \"vendor/bundle\" >> .bundle/config
を書けば、
.bundle/config
の内容が置換されるので一応の解決にはなる。
のどちらか。
あんまりスマートではない感じ。
envでBUNDLE_APP_PATH指定するとうまいこといくという情報も見たけどなぜか自分の環境ではうまく行かなかったので。