DockerのAlpineのapkが名前解決に失敗しててハマった


エラーメッセージ

ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.11/main: No such file or directory
WARNING: Ignoring APKINDEX.70f61090.tar.gz: No such file or directory
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.11/community: No such file or directory
WARNING: Ignoring APKINDEX.ca2fea5b.tar.gz: No such file or directory
2 errors; 15 distinct packages available


考えたこと

明らかにAlpine側の問題だろうと思っていたのですが、
このIssueがだいぶ前からあったみたいで、

ここでめっちゃ盛り上がっています。
何が原因なのかよくわからないんですけど、
http://dl-cdn.alpinelinux.org/alpine/v3.11/community
直接curlで取りに行くと取れるんですよね。
にも関わらず、Error MessageはNo such file or directoryとなっている。

ということは、
- Alpine側のDNSがぶっ壊れているのか
- Dockerコンテナの内部ネットワークがおかしくなっているのか

と考えられそうです。

まぁ、Dockerでyumやaptでファイルはとってこれているので、おかしいことないと思うのですが、一応Dockerのホストを探す仕組みを調べてみます。

Dockerの外部との通信の仕組みが簡潔にわかりやすく書いてありますね。

この警告は、Docker コンテナがローカルの DNS サーバを使えないためです。そのかわりDocker はデフォルトで外部のネームサーバを使います。

なるほど。どうぞどうぞって感じですが、使っているDNSサーバーは違うんですね。

ローカルのみてるDNSと別物みたいですし、このネームサーバーに到達できなくてコケている説をまず考えてみますか。

とりま、Dockerのイメージの内部で、どのように名前解決しているのかを調べたいのですが、どこにDNSの設定ファイルがあるのか。。。

頑張って調べたところ、どうやら/etc/resolv.confが参照しているDNSのアドレスを設定する場所っぽかったので確認すると

nameserver 8.8.8.8
nameserver 8.8.4.4

となっていました。

ローカルのマックの方は

#
# macOS Notice
#
# This file is not consulted for DNS hostname resolution, address
# resolution, or the DNS query routing mechanism used by most
# processes on this system.
#
# To view the DNS configuration used by this system, use:
#   scutil --dns
#
# SEE ALSO
#   dns-sd(1), scutil(8)
#
# This file is automatically generated.
#
nameserver 192.168.254.2
nameserver 8.8.8.8

192の方が普通にローカルが参照してるDNSだろうなぁという感じ
8.8.8.8はDockerによって追記されたものだろうけど、
多分ここにたどり着いていないんですよね。
なので、

nameserver 192.168.254.2
nameserver 8.8.8.8
nameserver 8.8.4.4

としてみると、

うまくいきました

8.8.8.8からAlpineが見えないのは結局Alpine側が悪いってことでいいんですかね??(よくわかってない)