Je fais affaire avec un héritage Dockerfile. Voici une très simplifié version de ce que je fais:
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.
Cela conduit au problème suivant lors de mon installation. Par exemple, la première apt
installe python-numpy
. Plus tard, pip
tente d'installer une version plus récente d' numpy
de 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.
J'ai pu également utiliser l' --ignore-installed
option lorsque j'essaie d' pip
installer des choses qui ont déjà été installés par 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 broche 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
jamais.
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 la pip
10 ne pas être en mesure d'installer des versions plus récentes de l' distutils
forfaits? Merci!!!!
Mise à JOUR:
Je ne savais pas que l' --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.