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