Dockerfile RUN合并pip命令

Siyu

我有一个看起来像这样的旧dockerfile

FROM ubuntu:16.04
ENV VISUAL=vim
ENV EDITOR=$VISUAL
ENV TERM=xterm
ENV TERMINFO=/etc/terminfo
ENV PYTHONIOENCODING=utf-8
RUN apt-get --yes update && apt-get --yes upgrade && apt-get --yes install python \
    python-dev \
    python-pip
<...lots of other apt-get install...>
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
<...other staffs>

效果很好,但是我想通过减少图层来减小图像尺寸。所以我合并了最后两行

RUN pip install --upgrade pip && \
 pip install -r requirements.txt

但是构建失败...

Step 15/45 : RUN pip install --upgrade pip &&  pip install -r requirements.txt
 ---> Running in b96971e60263
Collecting pip
  Downloading https://files.pythonhosted.org/packages/c2/d7/90f34cb0d83a6c5631cf71dfe64cc1054598c843a92b400e55675cc2ac37/pip-18.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-18.1
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

合并这两行时我想念什么?

w

假设:在中pip install --upgrade pippip命令运行为/usr/bin/pip,并且在升级时pip,会pip在处创建一个新的可执行文件/usr/local/bin/pip这种新的可执行文件是什么pip install -r requirements.txt应该运行,但是当你把它们放在一个RUN命令,从而在一个单一的shell实例运行它们,命令位置踢的外壳的缓存,因此第二pippip ... && pip ...最终被从同一位置运行首先,由于旧版本和新版本之间pip内部的变化而导致失败。您可以pip通过hash -d pip在单个RUN命令的中间插入来强制外壳程序取消缓存位置

RUN pip install --upgrade pip && \
 hash -d pip && \
 pip install -r requirements.txt

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章