サービス環境
ruby 2.6.8
Rails 6.1.5
docker
"Could not find [gem name] in any of the sources"
Railsでツイッターのクローンの課題でOmniauthを使ってgit hubのアカウントでログインできる機能を作ろうとしましたが、Railsコマンド実行時に"Could not find [gem name] in any of the sources"
のエラーが出ました。
お前が使おうとしているgemどこにもないやねん! と怒られましたね。w
原因
gemfile
の周りが怪しいと思って、Omniauth gem
の各依存を調べたりして色々試してみましたが、解決できませんでした。
それで、疑惑の領域を広げて、Railsのコマンドの周り、docker-compose
のコマンド等について調べた結果、やっと原因がわかりました。
原因はDocker-compose.yml
ファイルでした。
課題を始める時に、Dockerの学習が終わった段階だったので、
Dockerfile
とDocker-compose.yml
も自作をしたんですが、、不備があったみたいですね。
もっと正確にいうと "docker-compose.ymlでgemの永続化をしてなかった。" になりますね。
gemの永続化をしていないと、コンテナ上でbundle install
を実行してもDocker Imageにはgemが保存がされないので、上記のようなエラーが発生しますね。
永続化をしないとgemをインストールするためにdocker-compose build
→ コンテナ起動
という手間が発生します。
おそらくOmniauth gem
をインストールする前には色々設定をするために頻繁にImageを新しくbuild
したので、
gemが問題なくインストールされたかなと思います。
対応
すみません、余談が長かったです。
gemを永続化するためにはやるべきことはdocker-compose.ymlに下記の1行を追加するだけです。
- gem_data:/usr/local/bundle
下記のような感じですね。
web:
build: .
command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
ports:
- "3000:3000"
container_name: "web"
volumes:
- ".:/gassiper_rails"
- gem_data:/usr/local/bundle
tty: true
stdin_open: true
depends_on:
- db
links:
- db
db: ・ ・ ・
最後に
Railsのgemに関してのエラーだったので、gem周りを何日もかけて調べましたが、原因はdocker-compose.ymlにあったということから、
複数のプログラミング言語やライブラリ、ソフトウェアプラットフォームを使うときはエラー調査は言語間の関連性等を考える広い視野を持たないといけない! ことが学べた非常にいい経験でしたね。
余談が長くなって、記事自体が長くなってしまいましたが、
以上で"Could not find [gem name] in any of the sources"
のエラーの対応についてでした。
読んでいただき、ありがとうございます。