我尝试通过 pip 安装一个包。但是,每次使用需要 Internet 连接的 pip(即使是下面的升级)都会导致 ReadTimeoutError。我在另一个系统上工作的基本 Dockerfile 如下:
FROM python:3-alpine
RUN wget google.com
RUN pip3 -V
RUN pip3 install --upgrade pip
Run Code Online (Sandbox Code Playgroud)
第二行显示我有互联网连接。输出:
Connecting to google.com (216.58.206.14:80)
Connecting to www.google.com (108.177.126.103:80)
index.html 100% |*******************************| 10582 0:00:00 ETA
Run Code Online (Sandbox Code Playgroud)
第三行显示安装了pip。输出:
pip 10.0.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)).
Run Code Online (Sandbox Code Playgroud)
但是,第四行导致:
Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=100.0)",)': /simple/pip/
Run Code Online (Sandbox Code Playgroud)
我已经尝试过:
重新安装 Docker
使用“--default-timeout=100”增加默认超时(这就是为什么上面的错误消息中的读取超时为 100。)
我读到当您在代理后面时 pip 会出现问题,但这里的情况并非如此。你有什么其他想法这里有什么问题吗?
提前致谢!
小智 6
当您的主机的网络接口使用小于默认的 MTU(通常为 1500),并且 docker 容器不知道这一点并使用更大的 MTU 时,也可能会导致这种情况。
我们在连接到 VLAN(MTU 为 1400)的 Gitlab 运行器上遇到了这个问题。与某些主机的连接工作正常,但有些主机出现持续性问题(其中:PyPI,导致此处提到的错误)。
解决方案是更改 docker 的 MTU,所有问题都消失了。
/etc/docker/daemon.json
{
"mtu": 1400
}
Run Code Online (Sandbox Code Playgroud)
有两种可能的解决方案:
ENV http_proxy http://proxy-chain.xxx.com:911/
ENV https_proxy http://proxy-chain.xxx.com:912/
Run Code Online (Sandbox Code Playgroud)
或者更换其他镜像源:在pip install之前添加以下命令
RUN mkdir ~/.pip && \
cd ~/.pip/ && \
echo "[global] \ntrusted-host = pypi.douban.com \nindex-url = http://pypi.douban.com/simple" > pip.conf
Run Code Online (Sandbox Code Playgroud)
--default-timeout=1000 --no-cache-dir
Run Code Online (Sandbox Code Playgroud)