0
0

More than 1 year has passed since last update.

"Could not find [gem name] in any of the sources"のエラーが出たときの対応

Posted at

サービス環境

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の学習が終わった段階だったので、
DockerfileDocker-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
下記のような感じですね。

docker-compose.yml

  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"のエラーの対応についてでした。
読んでいただき、ありがとうございます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0