Je souhaite créer un conteneur avec python et quelques packages sur centos. J'ai essayé d'exécuter plusieurs commandes dans le conteneur brut de centos. Tout a bien fonctionné, j'ai installé tout ce que je veux. Ensuite, j'ai créé Dockerfile avec les mêmes commandes exécutées via RUN et j'obtiens / bin / sh: pip: command not found faux? Je veux dire la situation du tout. Pourquoi tout pourrait être exécuté dans la ligne de commande mais pas être exécuté avec RUN ? J'ai essayé les deux variantes:
from centos
run yum install -y centos-release-scl\
&& yum install -y rh-python36\
&& scl enable rh-python36 bash\
&& pip install django
et
RUN command\
&& command\
&& pip install ...
Commandes que j'exécute:
RUN command RUN command RUN pip install ...
3 Réponses :
Vous devez d'abord installer pip en utilisant
yum whatprovides /usr/bin/pip python2-pip-18.1-1.fc29.noarch : A tool for installing and managing Python 2 packages Repo : @System Matched from: Filename : /usr/bin/pip python2-pip-18.1-1.fc29.noarch : A tool for installing and managing Python 2 packages Repo : updates Matched from: Filename : /usr/bin/pip python2-pip-18.0-4.fc29.noarch : A tool for installing and managing Python 2 packages Repo : fedora Matched from: Filename : /usr/bin/pip
ou si vous avez besoin de python3 (depuis epel)
yum install python36-pip
En cas de doute, demandez yum:
yum install python-pip
Cette sortie provient de Fedora29, mais vous devriez obtenir un résultat similaire dans Centos / RHEL p >
MISE À JOUR
Du commentaire
Mais quand j'exécute les mêmes commandes depuis le docker, lancez -ti centos tout c'est bien. Quel est le problème?
Peut-être que votre PATH est cassé d'une manière ou d'une autre? Pouvez-vous essayer le chemin complet vers pip?
Mais quand j'exécute les mêmes commandes depuis docker run -ti centos , tout va bien. Quel est le problème?
Comme cela a déjà été mentionné par @rkosegi , il doit s'agir d'un problème de PATH . Ce qui suit semble fonctionner:
RUN cd /app/src && ./build.sh
J'ai "trouvé" le PATH ci-dessus en démarrant un conteneur centos et en tapant les commandes une par une -one (puisque vous avez mentionné que cela fonctionne).
Il y a une belle explication à ce sujet, dans les diapositives de BMitch qui peut être trouvé ici: sudo-bmitch.github.io/presentations/dc2018/faq-stackoverflow.html#24
Q: Pourquoi RUN ne fonctionne-t-il pas?
Pourquoi est-ce que je reçois
./build.shest introuvable?RUN cd /app/srcRUN ./build.sh
La seule partie enregistrée à partir d'un RUN est le système de fichiers (en tant que nouveau calque).
Les variables d'environnement, les démons lancés et l'état du shell sont tous supprimés avec le conteneur temporaire à la fermeture de pid 1.
Solution: fusionner plusieurs lignes avec
&&:FROM centos ENV PATH /opt/rh/rh-python36/root/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin RUN yum install -y centos-release-scl RUN yum install -y rh-python36 RUN scl enable rh-python36 bash RUN pip install django
Je sais que cela a été demandé il y a quelque temps, mais je viens d'avoir ce problème lors de la création d'une image Docker, et je n'ai pas été en mesure de trouver rapidement une bonne réponse, je vais donc la laisser ici pour la postérité.
Ajout la commande scl enable ne fonctionnait pas pour moi dans mon Dockerfile, j'ai donc constaté que vous pouvez activer les packages scl sans la commande scl en exécutant:
source / opt / rh / .
Si je me souviens bien, vous ne pourrez pas faire:
source scl_source enable <package>
Parce que chaque La commande RUN crée une couche différente et les sessions shell ne sont pas conservées, donc j'ai juste exécuté les commandes ensemble comme ceci:
RUN source / opt / rh / rh-python36 / enable && pip install
Je pense que la commande scl a des problèmes de fonctionnement dans Dockerfiles car scl enable ouvrira un nouveau shell dans votre actuel un, rat plutôt que d'ajouter le package au chemin dans votre shell actuel.
Modifier:
Trouvé que vous pouvez ajouter des packages à votre shell actuel en exécutant:
RUN source /opt/rh/<package-name>/enable RUN pip install <package>
@tgogos Ma question porte plus du tout sur le problème, pas sur cette affaire. Pourquoi les commandes s'exécutent bien depuis l'intérieur du conteneur mais pas via
RUNUne autre approche serait de démarrer
FROM centos / python-36-centos7qui se trouve sur docker hub