読者です 読者をやめる 読者になる 読者になる

ヤルキデナイズド

Unclassified Articles on Software and IT

.dev で終わる hostname のとき gem install が(ある条件で)失敗するようになった

追記:うまい要約を見つけたので貼っておく。


最近 .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 が登録されことはない。

参考:


ブコメ返信

(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)