Dockerfile RUN объединяет команды pip - PullRequest
0 голосов
/ 24 ноября 2018

У меня был старый докер-файл, который выглядит следующим образом

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>

Он работал хорошо, но я хочу уменьшить размер изображения за счет уменьшения слоев.Поэтому я объединил последние 2 строки

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

Что я пропустил, когда слил эти две строки?

1 Ответ

0 голосов
/ 24 ноября 2018

Гипотеза: в pip install --upgrade pip команда pip запускается /usr/bin/pip, а при обновлении pip она создает новый исполняемый файл pip в /usr/local/bin/pip.Этот новый исполняемый файл - это то, что должен запускать pip install -r requirements.txt, но когда вы помещаете их в одну команду RUN и, таким образом, запускаете их в одном экземпляре оболочки, кэширование оболочки командных мест запускается, и, таким образом, вторая pipв pip ... && pip ... запускается из того же места, что и первый, что не удается из-за изменений внутренних компонентов pip между старой и новой версией.Вы можете заставить оболочку разархивировать местоположение pip, вставив hash -d pip в середине одной команды RUN:

RUN pip install --upgrade pip && \
 hash -d pip && \
 pip install -r requirements.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...