Docker

【Docker/Python】”NewConnectionError~”でpipに失敗したときの解決法

さて、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側に反映されるようになります。

それではまた。

COMMENT

メールアドレスが公開されることはありません。