みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

VScode Remote - Containers のエラー "Could not resolve host" を修正する

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を利用して解決できました.