1
votes

Pourquoi Dockered Centos ne reconnaît pas le pip?

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 ...


2 commentaires

@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 RUN


Une autre approche serait de démarrer FROM centos / python-36-centos7 qui se trouve sur docker hub


3 Réponses :


2
votes

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?


1 commentaires

Mais quand j'exécute les mêmes commandes depuis docker run -ti centos , tout va bien. Quel est le problème?



1
votes

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.sh est 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
    


0 commentaires

0
votes

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 / / enable .

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 bash 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>


0 commentaires