如果pip在一个运行节中安装并更新到10.0.1,Docker构建失败

2024-10-01 07:41:45 发布

您现在位置:Python中文网/ 问答频道 /正文

你如何解释docker build失败与{},以及它是成功的{}(见下文)。在

(一)

// 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 .失败,错误如下

^{pr2}$

但是,如果我们把它分成两个RUN,它就会成功。在

(二)

// 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有关。所以我的问题是:

  1. 为什么docker build在第一种情况下失败?如果我们在bash中运行这些命令,就不会有任何错误。在
  2. 为什么docker build在第二种情况下成功?它和docker的分层概念有什么关系?在
  3. 为什么在Dockerfile1(即pip install --upgrade pip=0.9.3)中指定pip version也解决了这个问题?在

Update (May 6, 2018):

我已经解决了这个问题。这里发生的情况如下:

  1. apt-get -y install python-pip安装旧版本的pip,其填充程序脚本直接导入pip的main。

  2. pip install --upgrade pip安装pip 10.0.1并将main移动到一个内部目录_internal。它将其填充程序脚本添加到PATH

  3. 调用pip失败,因为它在缓存路径时仍然调用旧的shim脚本。在中间运行hash -d pip可以修复此问题。在

显然,将安装和更新分成两个RUN部分与hash -d pip具有相似的效果。解决方法(也由Andriy Maletsky建议)是1)pin pip更新到9.0.3,或者2)首先从源安装(最新的)pip,或者3)在中间使用hash -r,或者4)使用另一个RUN命令以便以后使用pip。在


Tags: installpipdockerrunfrombuild脚本get
1条回答
网友
1楼 · 发布于 2024-10-01 07:41:45

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

可能的解决方案:
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 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 bug出现在版本10中。在

注意:您不应该更新或手动更改通过apt-get添加到系统中的文件(您是通过pip install upgrade pip来执行此操作的)。在

相关问题 更多 >