Я имею дело с устаревшим Dockerfile. Вот очень упрощенная версия того, с чем я имею дело:
FROM ubuntu:14.04
RUN apt-get -y update && apt-get -y install \
python-pip \
python-numpy # ...and many other packages
RUN pip install -U pip
RUN pip install -r /tmp/requirements1.txt # includes e.g., numpy==1.13.0
RUN pip install -r /tmp/requirements2.txt
RUN pip install -r /tmp/requirements3.txt
Сначала несколько пакетов устанавливаются с помощью apt
, а затем несколько пакетов устанавливаются с помощью pip
. pip
версия 10 была выпущена, и частью выпуска является это новое ограничение:
Удалена поддержка для удаления проектов, которые были установлены с помощью distutils. Установленные проекты distutils не включают метаданные, указывающие, какие файлы принадлежат этой установке, и, следовательно, невозможно фактически удалить их, а не просто удалить метаданные, говоря, что они были установлены, оставив при этом все фактические файлы.
Это приводит к следующей проблеме в моей настройке. Например, first apt
устанавливает python-numpy
. Позже pip
пытается установить более новую версию numpy
например, из /tmp/requirements1.txt
, и пытается удалить старую версию, но из-за нового ограничения он не может удалить эту версию:
Installing collected packages: numpy
Found existing installation: numpy 1.8.2
Cannot uninstall 'numpy'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
Теперь я знаю, что на данный момент есть несколько решений.
Я не мог установить python-numpy
через apt
. Однако это вызывает проблемы, поскольку python-numpy
устанавливает несколько различных пакетов в качестве требований, и я не знаю, зависит ли другая часть системы от этих пакетов. И в самом деле, есть несколько apt
пакетов, установленных через Dockerfile, и каждый из них я извлекаю, кажется, показывают другой Cannot uninstall X
ошибку, и снимают ряд других пакетов, наряду с этим, что наше приложение может или не может полагаться.
Я мог бы также использовать --ignore-installed
вариант, когда я пытаюсь pip
установить вещи, которые уже были установлены через apt
, но затем снова у меня такая же проблема каждого --ignore-installed
аргумента, раскрывающий еще одну вещь, которая должна быть игнорируются.
Я мог бы прикрепить pip
к более старой версии, которая не имеет этого ограничения, но я не хочу застрять, используя устаревшую версию pip
навсегда.
Я ходил кругами, пытаясь найти хорошее решение, которое включало бы минимальные изменения в этот устаревший Dockerfile и позволяло приложению, которое мы развертываем с этим файлом, продолжать функционировать, как было. Любые предложения о том, как я могу благополучно обойти эту проблему pip
10 не в состоянии установить новые версии distutils
пакетов? Спасибо!
ОБНОВИТЬ:
Я не понимал, что --ignore-installed
можно использовать без пакета в качестве аргумента, чтобы игнорировать все установленные пакеты. Я думаю о том, может ли это быть хорошим вариантом для меня, и спросил об этом здесь.