web-dev-qa-db-fra.com

Les paquets pip -e n'apparaissent pas dans Docker

J'ai un fichier requirements.txt contenant, entre autres:

Flask-RQ==0.2
-e git+https://token:[email protected]/user/repo.git#Egg=repo

Lorsque j'essaie de créer un conteneur Docker à l'aide de Docker Compose, il télécharge les deux packages et les installe tous les deux, mais lorsque je crée un pip freeze, il n'y a aucun signe du package -e. Lorsque j'essaie d'exécuter l'application, j'ai l'impression que ce paquet n'a pas été installé. Voici la sortie pertinente de la construction:

Collecting Flask-RQ==0.2 (from -r requirements.txt (line 3))
  Downloading Flask-RQ-0.2.tar.gz
Obtaining repo from git+https://token:[email protected]/user/repo.git#Egg=repo (from -r requirements.txt (line 4))
  Cloning https://token:[email protected]/user/repo.git to ./src/repo

Et voici ma Dockerfile:

FROM python:2.7

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY requirements.txt /usr/src/app/
RUN pip install -r requirements.txt

COPY . /usr/src/app

Je trouve cette situation très étrange et apprécierais toute aide.

18
linkyndy

J'ai rencontré un problème similaire, et l'une des manières possibles pour que le problème apparaisse est de:

WORKDIR /usr/src/app

étant défini avant pip install. pip créera le répertoire src/ (où le paquet est installé) à l'intérieur de WORKDIR. Désormais, tout cela ne devrait pas poser de problème, car vos fichiers d'application, une fois copiés, ne devraient pas écraser le répertoire src/.

Cependant, vous pourriez être monter un volume à /usr/src/app. Cela fait, vous écraserez le répertoire /usr/src/app/src et votre paquet ne sera plus trouvé.

Donc, un correctif consiste à déplacer WORKDIR après le pip install. Donc, votre Dockerfile ressemblera à:

FROM python:2.7

RUN mkdir -p /usr/src/app

COPY requirements.txt /usr/src/app/
RUN pip install -r /usr/src/app/requirements.txt

COPY . /usr/src/app
WORKDIR /usr/src/app

Cela a résolu le problème pour moi. J'espère que ça fonctionnera pour vous.

21
mikexstudios

@mikexstudios est correct, cela se produit car pip stocke la source du paquet dans /usr/src/app/src, mais vous montez un répertoire local dessus, ce qui signifie que python ne peut pas trouver la source du paquet.

Plutôt que de changer la position de WORKDIR, je l'ai résolue en changeant la commande pip en:

pip install -r requirements.txt --src /usr/local/src

L'approche à l'éther devrait fonctionner.

19
Adrian Macneil

Si vous rencontrez une erreur similaire lors de l'installation d'un dépôt Git à partir d'un fichier de conditions requises sous un conteneur dockerized, vous avez peut-être oublié d'installer git. 

Voici l'erreur que j'ai reçue: 

Downloading/unpacking CMRESHandler from 
git+git://github.com/zigius/python-elasticsearch-logger.git (from -r 
/home/ubuntu/requirements.txt (line 5))
Cloning git://github.com/zigius/python-elasticsearch-logger.git to 
/tmp/pip_build_root/CMRESHandler
Cleaning up...
Cannot find command 'git'
Storing debug log for failure in /root/.pip/pip.log
The command '/bin/sh -c useradd ubuntu -b /home && echo 
"ubuntu     ALL     = NOPASSWD: ALL" >> /etc/sudoers             && 
chown -R ubuntu:ubuntu /home/ubuntu && pip install -r /home/ubuntu/requirements.txt returned a non-zero code: 1

Voici un exemple de fichier Docker qui installe git, puis toutes les exigences: 

FROM python:3.5-slim

RUN apt-get update && apt-get install -y --no-install-recommends git \

ADD . /code       

WORKDIR /code
RUN pip install --upgrade pip setuptools && pip install -r /home/ubuntu/requirements.txt

Vous pouvez maintenant utiliser les packages git dans votre fichier de configuration dans un environnement dockerisé.

2
ZiGiUs