gpt4 book ai didi

python - 如果在单个RUN部分中安装了pip并将其更​​新为10.0.1,则Docker构建失败

转载 作者:行者123 更新时间:2023-12-02 21:16:58 30 4
gpt4 key购买 nike

您将如何用docker build来解释Dockerfile1失败,以及如何使用Dockerfile2来解决成功(请参见下文)。

1)

// Dockerfile1

FROM ubuntu:16.04

RUN apt-get -y update && \
apt-get -y install python-pip python-dev build-essential && \
pip install --upgrade pip && \
pip install --upgrade virtualenv
docker build .失败,并显示以下错误
Collecting pip
Downloading
https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl (1.3MB)
Installing collected packages: pip
Found existing installation: pip 8.1.1
Not uninstalling pip at /usr/lib/python2.7/dist-packages, outside
environment /usr
Successfully installed pip-10.0.1
Traceback (most recent call last):
File "/usr/bin/pip", line 9, in <module>
from pip import main
ImportError: cannot import name main
The command '/bin/sh -c apt-get -y update && apt-get -y install
python-pip python-dev build-essential && pip install --upgrade pip && pip install --upgrade virtualenv && virtualenv /venv' returned a non-zero code: 1

但是,如果我们将其拆分为两个 RUN,它将成功。

2)
// Dockerfile2

FROM ubuntu:16.04

RUN apt-get -y update && \
apt-get -y install python-pip python-dev build-essential && \
pip install --upgrade pip

RUN pip install --upgrade virtualenv
pip的安装失败与此 reported issue有关。所以我的问题是:
  • 在第一种情况下,为什么docker build失败?如果我们只是在bash中运行这些命令,就不会有任何错误。
  • 在第二种情况下,为什么docker build成功?它与docker中的分层概念有何关系?
  • 为什么还要在Dockerfile1(即pip install --upgrade pip=0.9.3)中指定点子版本也可以解决此问题?

  • Update (May 6, 2018):



    我已经解决了这个问题。发生的情况如下:
  • apt-get -y install python-pip安装了旧版本的pip,其shim脚本直接导入pip的main。
  • pip install --upgrade pip将安装pip 10.0.1并将main移动到内部目录_internal中。它将其填充脚本添加到PATH中。
  • 调用pip失败,因为它的路径被缓存时仍会调用旧的填充脚本。在两者之间运行hash -d pip可解决此问题。

  • 因此,显然,将安装和更新分为两个 RUN部分与 hash -d pip具有相似的效果。解决方法(Andriy Maletsky也建议)是:1)将 pip引脚更新为9.0.3,或者2)首先从源代码安装(最新)pip,或者3)在中间使用 hash -r,或者4)使用另一个RUN命令以后使用点子。

    最佳答案

    问题在于,在将pip从版本9更新到版本10时,pip可执行文件(/usr/bin/pip)中断了。

    可能的解决方案:
    1.不要更新和使用pip v9
    2.不要使用apt-get安装pip。 Download it manually

    Why does docker build fail in the first case? If we just run those command in bash, there wont be any error.



    不,会有错误。我在 docker run --rm -it ubuntu:16.04 bash中运行了这些命令并得到了它。

    Why does docker build succeed in the second case? How is it related to layering concept in docker?



    我相信您在第二次RUN中某个地方犯了一个错误,并且正在消除错误(在您未提供的位置)。例如,这将起作用(因为使用 ;而不是 &&且执行错误的命令后执行不会中断):
    RUN pip install --upgrade virtualenv && \
    virtualenv /venv; source /venv/bin/activate

    Why specifying pip version in Dockerfile1 (i.e. pip install --upgrade pip=0.9.3) solves the problem too?



    因为此pip错误出现在版本10中。

    附言您不应该更新或手动更改通过 apt-get添加到系统中的文件(通过 pip install --upgrade pip这样做)。

    关于python - 如果在单个RUN部分中安装了pip并将其更​​新为10.0.1,则Docker构建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50184873/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com