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

我已经四处奔波了一段时间来解决这个问题,但我似乎无法让它工作。我有一个docker容器,在那里我为机器学习设置了一个nvidia映像。我安装了所有python依赖项。然后我从pip包安装开始。我得到第一个错误:

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))