Alpineはホスト名による名前解決ができない(?)

結論から言うとそんなことはなく、名前解決できなかった原因は不明なのだが同様の問題にぶち当たった人のために記録を残しておく。

DockerコンテナからDBサーバに接続しようとしたところ、名前解決に失敗してDB接続できないという問題が発生した。この問題はイメージをUbuntuベースからAlpineベースのOpenJDKイメージに変えたところで発生し、Ubuntuベースに戻すと再び接続可能になったのでAlpineに何かあると推測された。

調べたところ過去のAlpine Linux/etc/resolve.conf のsearchとdomainを無視していた。よって接続先のホスト名はFQDNで指定しなくてはならなかったらしい。 今回は jdbc:postgresql://prd-hoge-db01:5432/dbname のようにホスト名のみの接続先指定をしていたのだが、これはNG。

これはglibcのかわりにalpineが採用しているmusl libcというライブラリの制限

https://wiki.musl-libc.org/functional-differences-from-glibc.html#Name-Resolver/DNS

musl’s resolver previously did not support the “domain” and “search” keywords in resolv.conf. This feature was added in version 1.1.13

しかし、これは previously did not とあるように過去のバージョンの話であって、Alpine 3.3以下のかなり古いバージョンを使っていなければ関係ないはずである。

結局、原因はよく分からなかった。いろいろ試しているといつの間にかAlpineでも接続可能になっており真相は闇の中。"Alpine DNS" などでググると比較的最近のバージョンでも名前解決に失敗するというissueがよく出てくるので、たまたまバグのあるバージョンを踏んでしまったのかもしれない・・・