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.
Vous devez vous connecter pour publier un commentaire.
C'est la solution que j'ai fini par aller avec, et nos applications ont été en cours d'exécution en production sans problèmes pendant près d'un mois avec ce correctif en place:
Tout ce que j'avais à faire était d'ajouter
--ignore-installed
à la
pip install
lignes dans mon dockerfile qui ont été la levée des erreurs. En utilisant la même dockerfile exemple de ma question initiale, le fixe dockerfile ressemblerait à quelque chose comme:La documentation que j'ai pu trouver pour
--ignore-installed
était pas clair à mon avis (pip install --help
simplement dit "Ignorer les paquets installés (réinstallation de la place)."), et j'ai demandé sur les dangers potentiels de ce drapeau ici, mais n'ont pas encore obtenir de réponse satisfaisante. Cependant, si il y a des effets secondaires négatifs, notre environnement de production n'a pas encore vu les effets d'entre eux, et je pense que le risque est faible/aucune (à moins que notre expérience). J'ai été en mesure de confirmer que, dans notre cas, lorsque cet indicateur a été utilisé, l'installation existante n'a pas été désinstallé, mais que la nouvelle installation a toujours été utilisé.Mise à jour:
Je voulais souligner cette réponse par @ivan_pozdeev. Il fournit de l'information, que cette réponse ne comprennent pas, et il décrit également certains des effets secondaires potentiels de la solution.
C'est ce qui a fonctionné pour moi--
pip install --ignore-installé
ou sudo pip install --ignore-installé
ou (à l'intérieur de juoyter portable)
import sys
!{sys.exécutable} -m pip install --ignore-installé
Vous pouvez simplement supprimer numpy manuellement mais gardez à l'd'autres dépendances installé par apt. Ensuite, utilisez pip comme avant d'installer la dernière version de numpy.
L'emplacement de numpy devrait être le même. Mais si vous voulez vous assurer de l'emplacement que vous pouvez exécuter le conteneur, sans courir le requirements.txt fichiers et exécutez les commandes suivantes dans la console python à l'intérieur du conteneur.