末尾最適呼び出し化

東京のWebエンジニアの日記帳

railsのdocker開発環境をつくってて躓いたメモ

前提

扱っているプロジェクトが増えてきて、
また個人用のPCはLinuxにしていちいちそれぞれの開発環境を整えるのが面倒になってきたので、
docker-compose upさえすれば動く状態にしたかった。

いろいろ格闘したので備忘録

環境

  • docker for mac
  • docker-compose

dockerコンテナで使うもの

  • ruby 2.5.1
  • node vわすれた
  • mysql 5.7.9 (カラム名の最大長のアレの都合で。あと8はバグバグなので)

↑今回の話にあんまり関係ないかも

躓いたところ

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指定するとうまいこといくという情報も見たけどなぜか自分の環境ではうまく行かなかったので。