dockerで開発環境を構築した際、コンテナ内でbundle installしようとしたら下記のようなエラーが。
Fetching source index from https://rubygems.org/
Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Retrying fetcher due to error (3/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Retrying fetcher due to error (4/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Could not fetch specs from https://rubygems.org/
リクエストが正常に送れていないようです。。。
色々な記事を調べさせていただきましたが、よく見たのが
gem update --system
を実行すると直るというもの。
しかし、記事によっては「それでは効果がなかった」や「関係ないのでは」という声もあり、困惑
ただ「PCの再起動で直った」という記事もあって、とりあえずそれを試したところ、たしかに解消しbundle installできました...? しかし原因がわからないためモヤモヤしていました。
そんな中再度gemの更新でbundle installする際に同じエラーが再発してしまい、「これは絶対なんか原因あるでしょ」と思ってちょっと疑いながらも
gem update --system
を実行してみました。
すると綺麗サッパリ一瞬でコネクトしてbundle installできました。疑ってスミマセンデシタ
そもそもgem update --systemは、RubyGems自体のバージョンアップをするものということです。
「gem update --system」と「gem update」の違い
答えはここにあり?(※多分)
アップデートのログを見てみると、この様な記述がありました。
## Enhancements:
* Optionally fallback to IPv4 when IPv6 is unreachable. Pull request #2662
by sonalkr132
「IPv6で接続できない時にIPv4にフォールバックする機能を追加した」って感じだと思います。
フォールバックについては以下の記事を参考にしました。
IPv6/IPv4フォールバックとは
issueも見に行ったのですが、IPv6での接続ができないという声が多かったようです。ちゃんと隅々まで読んでいないのでご了承ください
https://github.com/rubygems/rubygems/pull/2662
手動で対策している方もいた
実際に「IPv6の場合に接続ができないため、IPv4のアドレスをetc/hostsに追加する」という対処法を取られている方がおられました。
rubygems.orgにアクセスできなくなった場合の解決法
Rails5.2でbundle install/updateができない。rubygems.orgに入れない
先程のissueにあったように、この問題を解決するためにフォールバックの機能を追加したアップデートがリリースされたのかな、と考えています。
結論
再起動で一度いけたのは何故だろうという気持ちではありますが、
rubygems.orgにつながらないときは、「IPv6で接続しようとして失敗している」という原因が考えられるため、gemを長らくアップデートしていない場合は、
gem update --system
をやってみるといいかもしれません。
これによりIPv6で失敗しても自動的にIPv4での接続に切り替えてくれる為、問題なく動作するということだと思います。