.dev で終わる hostname のとき gem install が(ある条件で)失敗するようになった
追記:うまい要約を見つけたので貼っておく。
内部で使っているサーバーに.devで終わるホスト名を付けたり、devという(勝手な)TLDがサーチリストに入っていたりすると、gem installコマンドが名前衝突問題を起こして異常終了すると。// http://t.co/AGzrPG6WG1
— Yasuhiro Morishita (@OrangeMorishita) 2015, 1月 9
最近 .dev TLD が新設された影響か、 hostname が .dev で終わる手元のマシンで gem install するとコケるようになった:
$ hostname foo.dev $ sudo /opt/rbenv/versions/2.2.0/bin/gem install bundler --no-document ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError) Errno::ECONNREFUSED: Connection refused - connect(2) for "your-dns-needs-immediate-attention.dev" port 443 (https://your-dns-needs-immediate-attention.dev/quick/Marshal.4.8/bundler-1.7.11.gemspec.rz)
具体的には次のいずれかの条件を満たす環境で再現する:
- hostname が .dev で終わり、かつ /etc/resolv.conf の search フィールドが設定されていない
- /etc/resolv.conf の search フィールドが
dev
を含む
1番目の条件は Ruby の Resolv ライブラリの挙動に由来する。 /etc/resolv.conf に search が設定されていないとき、 Resolv は hostname の TLD を search の値として扱うようになっている(resolv.rb の1010行目あたりを参照)。また RubyGems の名前解決の挙動とも関係する(この記事のコメントを参照)。
この問題を回避するには /etc/resolv.conf に適当な search hoge fuga
を設定すればよい。ただし hoge fuga は dev
を含まないこと。
search を設定できない事情があるなら hostname を変える。 TLD を含まないようにするかテスト用の TLD を使う。 RFC 2606 によれば、テスト用途に使える TLD は予約済みの4つのうち .test
と .example
の2つである。このどちらかを使えばよい。
あるいは .x
などの1文字の TLD が使えるかもしれない。仕様上は正しいが、これまでに1文字の TLD が登録されことはない。
参考:
- dns - Is it possible to have one (single) character top level domain name? - Stack Overflow (1文字TLDについて)
- NAME COLLISION OCCURRENCE ASSESSMENT (your-dns-needs…なるレスポンスについて)
- IT 専門家のための名前衝突の確認および抑止方法ガイド (pdf)
ブコメ返信
(gem の source を FQDN にすればいいという指摘について) id:happy_siro こういうこと?
$ sudo /opt/rbenv/versions/2.2.0/bin/gem sources list *** CURRENT SOURCES *** https://rubygems.org./
だめっぽい。
$ sudo /opt/rbenv/versions/2.2.0/bin/gem install bundler --no-document ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError) Errno::ECONNREFUSED: Connection refused - connect(2) for "your-dns-needs-immediate-attention.dev" port 443 (https://your-dns-needs-immediate-attention.dev/quick/Marshal.4.8/bundler-1.7.11.gemspec.rz)