1. 状況
以下のような場合に、この記事の方法で解決できる場合がある。
- wsl内でのbuild時にdockerイメージの取得に失敗する
docker compose build
の最初に、dockerイメージのダウンロード処理が走るが、その時点でエラーが発生してしまう。 - wsl内で
apt install <module>
を記載した Dockerfile の build に失敗する - wsl内で、
git clone
ができない
2. 開発環境
windowsPC上でwslを立ち上げ、wslマシンの中でgit clone
やdocker compose build
などを行っている。
3. 詳しい症状
3-1. docker compose build
実行時に docker image の取得に失敗
$ docker compose build
[+] Building 0.1s (4/4) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 2.18kB 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> ERROR [internal] load metadata for docker.io/library/python:3.9.10 0.0s
=> CANCELED [internal] load metadata for docker.io/library/node:18.12.1-buster-slim 0.0s
------
> [internal] load metadata for docker.io/library/python:3.9.10:
------
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head "https://registry-1.docker.io/v2/library/python/manifests/3.9.10": dial tcp: lookup registry-1.docker.io on [::1]:53: read udp [::1]:34604->[::1]:53: read: connection refused
failed to solve: rpc error
などというエラーが表示される。
3-2. apt install に失敗
docker-compose buildで、docker imageをビルドしようとしたところ、
Dockerfile内の apt install
のところで次のエラーが発生。
Err:1 http://deb.debian.org/debian buster InRelease
Temporary failure resolving 'deb.debian.org'
Err:2 http://security.debian.org/debian-security buster/updates InRelease
Temporary failure resolving 'security.debian.org'
3-3. git clone
実行時
$ git clone https://github.com/siruku6/py_web_docker_template.git
Cloning into 'py_web_docker_template'...
fatal: unable to access 'https://github.com/siruku6/py_web_docker_template.git/': Could not resolve host: github.com
Could not resolve host: github.com
というエラーが表示され、github.com
にアクセスできていないことが分かる。
4対処法
4-1. WSL 側の network 問題の解決
4-1-1. /etc/resolv.conf
作成
/etc/resolv.conf
に問題があるので、それを作成ないし修正することで解決する。
ファイル内を以下の2行だけにすると良いようだ。
nameserver 8.8.8.8
nameserver 8.8.4.4
4-1-2. /etc/wsl.conf
作成
これで、 /etc/resolv.conf
が上書きされてしまうことを防ぐ。
[network]
generateResolvConf = false
これがないと、wsl 再起動する度に、自動的に /etc/resolv.conf
が上書きされてしまうらしい。
4-1-3. /etc/resolv.conf
が削除されないように
ここまでの対策だけだと、 /etc/resolv.conf
が毎回削除されてしまう。
その対策が以下の記事に掲載されていた。
$ sudo chattr +i /etc/resolv.conf
こうしておくと、 wsl を再起動しても /etc/resolv.conf
が削除されなくて済む。
4-2. docker hub の認証を有効化
git clone のエラーの場合は関係ないが、 docker build などでエラーが出た時は、こちらが原因の可能性もある。
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: yourname
Password:
Login Succeeded
これで build が通ったりもした。
5. 関連記事
wsl ネットワークエラーの解決策は以下のgithub issueから見つけた。
もう少し詳しい情報が以下の記事で解説されていた(2023/05/04追記)
docker の認証切れに関してはこちらに記載あり。
/etc/resolv.conf
が削除される問題についてはこちらの記事に記載がありました。