pip 10 et apt: comment éviter de “Impossible de désinstaller le X” erreurs de distutils paquets

J'ai affaire à un héritage Dockerfile. Voici une très simplifié version de ce que je fais affaire avec:

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

Tout d'abord, plusieurs paquets sont installés à l'aide de apt, puis plusieurs paquets sont installés à l'aide de pip. pip version 10 a été publié, et le cadre de la publication est cette nouvelle restriction:

Supprimé le support pour la désinstallation de projets qui ont été installés à l'aide de distutils. distutils projets installés ne pas inclure les métadonnées indiquant quels fichiers appartiennent à installer et il est donc impossible de désinstaller, plutôt que de simplement supprimer les métadonnées en disant qu'ils ont été installés tout en laissant tous les fichiers réels derrière.

Ce qui conduit au problème suivant lors de mon installation. Par exemple, les premières apt installe python-numpy. Plus tard pip essaie d'installer une version plus récente de numpy, par exemple, /tmp/requirements1.txt, et tente de désinstaller l'ancienne version, mais en raison de la nouvelle restriction, il ne peut pas supprimer cette version:

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.

Maintenant, je sais à quel point il y a plusieurs solutions.

Je ne pouvais pas installer python-numpy par apt. Toutefois, cela provoque des problèmes, car python-numpy installe un peu différents forfaits sont les exigences, et je ne sais pas si une autre partie du système qui s'appuie sur ces paquets. Et en réalité, il existe plusieurs apt packages installés à travers le Dockerfile, et chacun, j'supprimer l'impression de découvrir un autre Cannot uninstall X d'erreur, et en retire un certain nombre d'autres paquets avec elle, que notre application peut ou ne peut pas compter sur.

Je pouvais aussi utiliser le --ignore-installed option lorsque j'essaie de pip installer des choses qui ont déjà été installés à travers apt, mais là encore j'ai le même problème de tous les --ignore-installed argument révélant encore une autre chose qui doit être ignoré.

Je pourrais pin pip à une ancienne version qui n'a pas cette restriction, mais je ne veux pas être coincé à l'aide d'une version obsolète de pip pour toujours.

J'ai tourné en rond en essayant de trouver une bonne solution qui implique un minimum de changements de cet héritage Dockerfile, et permet à l'application nous déployer avec ce fichier de continuer à fonctionner comme il l'a été. Des suggestions quant à la façon dont je peux contourner ce problème de pip 10 ne pas être en mesure d'installer des versions plus récentes de distutils paquets? Merci!!!!

Mise à JOUR:

Je ne savais pas que --ignore-installed pourrait être utilisé sans un package comme un argument pour ignorer tous les paquets installés. Je suis d'examiner si oui ou non cela peut être une bonne option pour moi, et ont demandé à ce sujet ici.

InformationsquelleAutor elethan | 2018-04-20