さて、Dockerコンテナ環境でpip installを実行したところ、以下のようなエラーが返ってきました。
結論としては名前解決の失敗が原因だったので、/etc/resolv.confにnameserver 8.8.8.8を追記して解消しました。
今回発生したエラーは以下のとおりです。
root@7a0da619dbb1:~# pip install --no-cache-dir requests WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7ff1b9635b90>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /simple/requests/
上記のエラーですが、調べたところ名前解決の失敗によって発生するエラーだということがわかりました。
どうやらDockerコンテナの/etc/resolv.confはホストOSのものを継承するようで、その宛先にコンテナからはアクセスできないことが原因でした。
僕のDockerはWSL2上に構築していたのですが、そもそもWSL2の/etc/resolv.confは、Windows側によって自動生成される設定になっていました。
そのため、コンテナではなく、ホストの/etc/resolv.confにnameserver 8.8.8.8を以下のように追記したことで、問題が解消されました。
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf: # [network] # generateResolvConf = false nameserver 172.17.64.1 nameserver 8.8.8.8
ちなみに、コメントアウトされている文のとおり、WSL2環境における/etc/resolv.confは自動生成されたものとなります。
そのため、上記のように/etc/resolv.confを変更するだけでは、WSL再起動時に設定が復元されてしまうため、永続的に設定を維持することができません。
今回解消した問題は一時的な問題だったようで、その後は、自動的に生成される仮想ネットワークのDNSへの問い合わせで問題は発生しませんでした。
しかしながら、もしDNSサーバの設定を永続化したい場合は、/etc/wsl.confというファイルを作成し、上記の設定をコピペしてください。
これで、起動時に任意の設定が自動的にWSL2側に反映されるようになります。
それではまた。