Rubyと筋肉とギターとわたし

筋トレが仕事です

【Docker】railsコンテナでbundle installしているのにCould not find gemと出る

f:id:rdwbocungelt5:20180816164743p:plain

どうもてぃです。

既存プロジェクトをdocker-composeで構成作るということで結構苦労してます。

いくつかトラブルがあったんですが、その中でも題にあるエラーで苦しみました。

環境

  • Docker version 18.09.7, build 2d0083d
  • docker-compose version 1.25.4, build unknown
  • rails 5.2.0

試したこと

以前も同じようなエラーが出たのでvolume関係で怒られているんだろうなと、検討をつけて対処しようとしました。

参考にしていたのがこちらの記事。

qiita.com

最後の対応にあったvolumeを削除するパターンを試しました。

volumeを一回削除し再度作成することによって、volumeの中身を/usr/local/bundleと同じにする

こちらですね。

僕が作成したプロジェクトではskip bundleは行っていなかったですし、bundle installも試していましたので、最後の頼みの綱、すがる思いで試してみました。

が、駄目でした。

同じBundler::GemNotFound: Could not find gemです。謎…

1から手順を見直す

手順を見直したとき、docker-composeを使ってrails newを行っていなかったことを思い出しました。

つまり、Dockerfileから先にimageを作成して、そのイメージを元にrails newしたということです。

で、 docker-compose buildした際に、先に作成したimageを指定してbuildしていなかったので、Gemfileで差が出た…と。

馬鹿じゃん自分。

解決策

めっちゃ簡単。

Gemfile.lockを削除してビルドし直すだけ。

$ rm Gemfile.lock; touch Gemfile.lock

$ docker-compose run <コンテナ名> bundle install

しょうもないことに1時間ほど費やしてしまいました。

もう二度と同じ轍を踏まないです。

ここに誓います。

追記(2021/01/27)

docker-compose.yml関連で一点ハマったので。

version: '3'

services:
  postgres:
    image: postgres:10-alpine
    container_name: postgres
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./docker/init/db:/docker-entrypoint-initdb.d
    ports:
      - '5555:5432'
  redis:
    image: redis:alpine
    container_name: redis
    ports:
      - '6379:6379'
    volumes:
      - redis-cache:/var/lib/redis/data
  web:
    build: .
    image: app
    command: bash -c 'rm -f tmp/pids/server.pid && bundle exec rails s -b 0.0.0.0 -p 3000'
    container_name: app
    ports:
      - '3000:3000'
    volumes:
      - .:/myapp:cached
      - /myapp/log
      - /myapp/.git
      - /myapp/tmp
      - /myapp/node_modules
      - /myapp/vendor # <- こいついらん
      - bundle:/usr/local/bundle
    tty: true
    stdin_open: true
    depends_on:
      - postgres
      - redis
  worker:
    build: .
    image: worker
    command: bundle exec sidekiq -C config/sidekiq.yml
    container_name: worker
    volumes:
      - .:/myapp
    depends_on:
      - postgres
      - redis

volumes:
  bundle:
    driver: local
  postgres-data:
    driver: local
  redis-cache:
    driver: local

vendor配下に設置していると、bundle installしても更新されません。

要注意。