19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Go 1.7のホスト名前解決の仕様変更

Posted at

Go 1.7の名前解決の仕様変更とDockerのscratchイメージの組み合わせで少しハマったのでそのメモです。

Go 1.7の名前解決の仕様

Go 1.6までpure Goの名前解決の実装は/etc/hostsを先に読み、なければDNSを引くという順序で固定でした。参考: Go 1.6のnet/conf.go

Go 1.7からはpure Goの実装でも/etc/nsswitch.confの設定に基づいた順番で名前解決を行うようになりました。 参考: net: allow netgo to use lookup from nsswitch.conf

The pure Go name resolution implementation now respects nsswitch.conf's stated preference for the priority of DNS lookups compared to local file (that is, /etc/hosts) lookups.
Go 1.7 Release Notes

nsswitch.confが存在しない場合は、Go 1.6までと違ってDNSルックアップが優先で、引けなければ/etc/hostsを見るという順番がデフォルトになり挙動が変わります。なおこの挙動はglibcのデフォルト(dns [!UNAVAIL=return] files)と同じにしているようです。 参考: net/conf.go#L200-L211

nsswitch.confが存在しないとき

GoでビルドしたバイナリをDockerイメージで動かすとき、ベースイメージにscratchやAlpine Linuxなどを選択することがあると思います。scratchやAlpine Linuxにはglibcが入っていないのでnsswitch.confが存在しません。そのため1. 7でビルドしたタイミングからDNSルックアップが優先されるようになるので注意が必要です。

自分はdocker-composeのlink機能で/etc/hostsに設定されるホスト名を使っていて、さらに運悪くDNSで引けるホスト名だったので1.7でビルドしてからリンクしたコンテナに繋げなくなりハマりました。Dockerのホスト側の/etc/hostsに同じホスト名の設定が入っている場合もコンテナ側からDNSで引けてしまうので注意が必要です。

ひとまずDockerイメージに/etc/nsswitch.confを含めることで解決しました。

19
16
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
19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?