VScode Remote - ContainersでGitHubのレポジトリをgit cloneしたところ,"Could not resolve host"というエラーが発生して実行できませんでした.
... Sending build context to Docker daemon 2.048kB Step 1/2 : FROM mcr.microsoft.com/vscode/devcontainers/base:0-alpine-3.14 ... [6270 ms] Start: Run in container: git clone --depth 1 https://github.com/mt/mt.git . Cloning into '.'... fatal: unable to access 'https://github.com/mt/mt.git/': Could not resolve host: github.com ...
原因の調査
どうやら名前解決ができていないようです.Docker CLIを実行しているMacOSのローカルマシンおよび,Docker Engineを実行しているUbuntu Serverのリモートマシン両方からcurl https://github.com
を実行したところ,正常にダウンロードできました.しかし,DockerのAlpineで同様のコマンドを実行しようとしたところ,同じエラーが発生することが分かりました.
% docker run --rm --name alpinetest alpine:latest sh -c 'apk add curl; curl https://github.com' ... Could not resolve host: github.com
ここで,dnsを指定して同様のコマンドを実行したところ,正常にダウンロードできました.
Container networking | Docker Documentation
% docker run --dns=8.8.8.8 --rm --name alp alpine:latest sh -c 'apk add curl; curl https://github.com'
つまり,DockerコンテナのAlpineでDNSの設定がうまくできていないのが原因であることが分かりました.
解決方法
Dockerで使用するDNSサーバーには,グローバルIPアドレスが付与されているパブリックDNSを利用することで解決します.ここでは,Google Public DNSを指定してみます.rootless Dockerならば~/.config/docker/daemon.json
に以下の内容を指定します.
{ "dns": ["8.8.8.8", "8.8.4.4"] }
Run the Docker daemon as a non-root user (Rootless mode) | Docker Documentation
再起動して,DockerコンテナのAlpineのDNSを確認してみます.
% docker run --rm --name alpinetest alpine:latest sh -c 'cat /etc/resolv.conf' nameserver 8.8.8.8 nameserver 8.8.4.4
DNSが正常に登録されました.以下のコマンドを実行しても,名前解決ができるようになりました.VScode Remote - Containers が動作しました.
docker run --rm --name alp alpine:latest sh -c 'apk add curl; curl https://github.com'
まとめ
DockerのDNSが適切に設定されていないことが原因のエラーでした.パブリックDNSを利用して解決できました.