Python Pip升级无法安装软件包
我已经四处奔波了一段时间来解决这个问题,但我似乎无法让它工作。我有一个docker容器,在那里我为机器学习设置了一个nvidia映像。我安装了所有python依赖项。然后我从pip包安装开始。我得到第一个错误:Python Pip升级无法安装软件包,python,docker,pip,ssl-certificate,Python,Docker,Pip,Ssl Certificate,我已经四处奔波了一段时间来解决这个问题,但我似乎无法让它工作。我有一个docker容器,在那里我为机器学习设置了一个nvidia映像。我安装了所有python依赖项。然后我从pip包安装开始。我得到第一个错误: requests.exceptions.SSLError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Max retries exceeded with url: /packages/5e/c4/6c4fe
requests.exceptions.SSLError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Max retries exceeded with url: /packages/5e/c4/6c4fe722df5343c33226f0b4e0bb042e4dc13483228b4718baf286f86d87/certifi-2020.6.20-py2.py3-none-any.whl (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),))
很简单,我有一个证书
来对付思科伞。然后我就可以轻松地安装所有软件包了。然而,为了能够安装最新的软件包,我需要升级pip,升级工作正常。在pip升级到20.2.3
之后,我突然又出现了一个错误:
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),)) - skipping
然后,我在谷歌上搜索并尝试了我偶然发现的建议:
定时
我发现系统时间是错误的——它适用于最初的pip版本,这很奇怪。然而,改变时间无助于解决这个问题
conf
我添加了一个pip.conf
文件,其中包含可信主机和证书的全局标记。同样的错误仍然存在
pip安装
RUN curl -v -k -H"Host; files.pythonhosted.org" https://files.pythonhosted.org/packages/8a/fd/bbbc569f98f47813c50a116b539d97b3b17a86ac7a309f83b2022d26caf2/Pillow-6.2.2-cp36-cp36m-manylinux1_x86_64.whl
---> Running in ac095828b9ec
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying ::ffff:146.112.56.166...
* TCP_NODELAY set
* Connected to files.pythonhosted.org (::ffff:146.112.56.166) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [85 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [3177 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [262 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* TLSv1.2 (IN), TLS handshake, Finished (20):
{ [16 bytes data]
* SSL connection using TLSv1.2 / AES256-GCM-SHA384
* ALPN, server did not agree to a protocol
我尝试过使用不同的受信任主机标志和cert标志,如果我理解正确,应该已经从conf文件中指定了cert标志。然而,这两种方法都不起作用
该做什么
我现在有点不知所措,在容器中安装证书允许我在升级到pip 20.2.3
后安装带有pip 9.0.1
(系统中的默认值)的软件包。我无法让它与任何包一起工作。我已经尝试了多个pip版本,但升级后,我在尝试重新安装时丢失了证书
ADD Cisco_Umbrella_Root_CA.cer /usr/local/share/ca-certificates/Cisco_Umbrella_Root_CA.crt
RUN chmod 644 /usr/local/share/ca-certificates/Cisco_Umbrella_Root_CA.crt
RUN update-ca-certificates --fresh
有人知道这是怎么发生的吗
更新
卷曲
RUN curl -v -k -H"Host; files.pythonhosted.org" https://files.pythonhosted.org/packages/8a/fd/bbbc569f98f47813c50a116b539d97b3b17a86ac7a309f83b2022d26caf2/Pillow-6.2.2-cp36-cp36m-manylinux1_x86_64.whl
---> Running in ac095828b9ec
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying ::ffff:146.112.56.166...
* TCP_NODELAY set
* Connected to files.pythonhosted.org (::ffff:146.112.56.166) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [85 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [3177 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [262 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* TLSv1.2 (IN), TLS handshake, Finished (20):
{ [16 bytes data]
* SSL connection using TLSv1.2 / AES256-GCM-SHA384
* ALPN, server did not agree to a protocol
从最后一行可以看出,他们在协议上不一致,通信失败不久前,我遇到了类似的问题。我的解决方案是在一个docker层中添加证书并安装依赖项 我不知道你的Dockerfile到底是什么样子的,但我想试试这样:
ADD Cisco_Umbrella_Root_CA.cer /usr/local/share/ca-certificates/Cisco_Umbrella_Root_CA.crt
RUN chmod 644 /usr/local/share/ca-certificates/Cisco_Umbrella_Root_CA.crt && \
update-ca-certificates --fresh && \
pip install --upgrade pip setuptools && \
pip install -r production.txt && \
rm /usr/local/share/ca-certificates/Cisco_Umbrella_Root_CA.crt # for extra safety
作为我的参考:
RUN mkdir -p -m 0600 ~/.ssh/ && \
ssh-keyscan <my host> >> ~/.ssh/known_hosts && \
eval `ssh-agent -s` && \
ssh-add <ssh key> && \
echo "Installing packages from pip. It might take a few minutes..." && \
pip install --upgrade pip setuptools && \
pip install -r production.txt && \
rm <ssh key>
运行mkdir-p-m0600~/.ssh/&\
ssh密钥扫描>>~/.ssh/已知的\u主机&&\
eval`ssh代理-s`&&\
ssh添加&\
echo“从pip安装软件包。可能需要几分钟……”\
pip安装--升级pip设置工具\
pip安装-r production.txt&&\
rm
其中ssh密钥已经是来自另一层的chmod 400
另外,确保
和apt更新
或apt安装-y ca证书
apt升级
- 答案和我的问题中建议的步骤肯定是一个人应该尝试的。如果有人不能让它工作,比如我,那么在这个特定的例子中,是it组织将信息设置为代理到伞,并且它不支持ssl扫描/解密。对于docker build docker问题,您确实需要显示docker文件的大部分
上面的细节似乎表明docker文件
FROM nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04
RUN set -ex \
&& apt update \
&& apt upgrade \
&& apt install -y curl python-pip
&& pip install --upgrade pip setuptools
没有dockerfile,就没有起点,唯一可以给出的答案是“你似乎有网络问题”。当我尝试上述方法时,一切都很好
在容器中使用Curl,我收到的ssl证书是
* Server certificate:
* subject: C=US; ST=California; L=San Francisco; O=Fastly, Inc; CN=r.ssl.fastly.net
* start date: Jul 20 18:19:08 2020 GMT
* expire date: Apr 28 19:20:25 2021 GMT
* issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign CloudSSL CA - SHA256 - G3
该证书是大多数系统都应该拥有的库存证书。您可以使用openssl来解释结果
当您添加Cisco\u Umbrella\u Root\u CA.cer时
您通过公司代理进行代理。看,否则,没有必要添加该证书。“在我的私人电脑上测试,没有任何问题”告诉你,它是环保的
您可以始终运行
docker run-it nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04以获取容器上的外壳,然后手动开始运行Dockerfile
中的命令。当出现问题时,请回到linux故障排除。毕竟,您处于类似ubuntu的环境中这似乎是您的证书(旧的或无效的)或您的(可能未更新的)pip版本的问题。
下面有一个关于针对相同(或类似)问题的对话的链接。
我希望,我能帮上忙
您能提供一个最小的复制存储库吗?@concision似乎无法做到这一点。我已经试过了,并在我的私人电脑上测试过,没有任何问题。在我看来,这似乎是一些网络问题。但IT部门表示不是:)因此,如果有人有想法,我想清空选项。您使用的基本图像是什么(即FROM
命令中的图像)?也许可以尝试用基础映像的Linux包管理器安装ca证书
Linux包?@concision这是我的来自“nvidia/cuda:10.0-cudnn7-RUNTION-ubuntu18.04”
,所以它必须正确吗?据我所知,安装步骤是在这里完成的这篇文章。或者,您是否有安装证书的特定方法?从最后一行可以看出,他们在协议上不一致,通信失败——实际上并非如此。这不是一个错误,只是一个信息。服务器似乎不接受提供的h2和http/1.1。在这种情况下,可能http/1.0甚至http/0.9最终可能已经协商好了。非常感谢您的输入,但是我一直收到相同的问题。我已经完成了以下->apt get安装,并在我的baselayer
中创建映像和升级pip包。然后,我在secondlayer
中使用您的第一个建议的修订版本来安装我的需求文件,但是在连接被“SSLError”(SSLError(1),[SSL:CERTIFICATE\u VERIFY]断开后会发出相同的https错误警告:重试(重试(重试(总计=0,连接=None,读取=None,重定向=None,状态=None))