你如何解释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 .
失败,错误如下
但是,如果我们把它分成两个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有关。所以我的问题是:
docker build
在第一种情况下失败?如果我们在bash中运行这些命令,就不会有任何错误。在docker build
在第二种情况下成功?它和docker的分层概念有什么关系?在Dockerfile1
(即pip install --upgrade pip=0.9.3
)中指定pip version也解决了这个问题?在Update (May 6, 2018):
我已经解决了这个问题。这里发生的情况如下:
apt-get -y install python-pip
安装旧版本的pip,其填充程序脚本直接导入pip
的main。
pip install --upgrade pip
安装pip 10.0.1
并将main
移动到一个内部目录_internal
。它将其填充程序脚本添加到PATH
。
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。在
问题在于,
pip
可执行文件(/usr/bin/pip
)在将pip从版本9更新到版本10时中断。在可能的解决方案:
1不要更新和使用pip v9
2不要使用
apt-get
来安装pip。Download it manually。在不,会有错误。我在
docker run rm -it ubuntu:16.04 bash
中运行了这些命令,得到了它。在我相信你在第二轮的某个地方犯了一个错误,这是在压制一个错误(在你没有提供的地方)。例如,这将起作用(因为使用了
;
而不是&&
,并且在错误的命令后执行不会中断):因为这个pip bug出现在版本10中。在
注意:您不应该更新或手动更改通过
apt-get
添加到系统中的文件(您是通过pip install upgrade pip
来执行此操作的)。在相关问题 更多 >
编程相关推荐