2015-04-27 21 views
9
Docker

Ho un file che contiene requirements.txt, tra gli altri:Pip installare pacchetti -e non apparire in

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

Quando provo a costruire un contenitore Docker utilizzando Docker Componi, scarica entrambi i pacchetti, ed installare entrambi, ma quando faccio un pip freeze non c'è alcun segno del pacchetto -e. Quando provo a eseguire l'app, sembra che questo pacchetto non sia stato installato. Ecco la relativa uscita dalla generazione:

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 

E qui il mio 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 

Trovo questa situazione molto strana e apprezzerebbe alcun aiuto.

+1

Sembra che il percorso della directory sia stato scritto in modo errato nell'ultima riga: 'COPY./Uso/src/app'.Anche se non sono proprio sicuro di cosa intendessi, dal momento che il tuo 'pip install' succede nel container. – Gigablah

+0

@Gigablah, mio ​​male, era un errore di battitura. Ma ancora, il problema rimane lo stesso. – linkyndy

+0

cosa produce l'output di 'pip list'? – Alik

risposta

15

mi sono imbattuto in un problema simile, e un possibile modo che il problema può apparire da:

WORKDIR /usr/src/app 

essere posto davanti pip install. pip creerà la directory src/ (dove è installato il pacchetto) all'interno del WORKDIR. Ora tutto ciò non dovrebbe essere un problema dato che i tuoi file di app, una volta copiati, non dovrebbero sovrascrivere la directory src/.

Tuttavia, potrebbe essere montare un volume a /usr/src/app. Quando lo fai, sovrascrivi la directory /usr/src/app/src e quindi il tuo pacchetto non verrà trovato.

Quindi una correzione è spostare WORKDIR dopo pip install. Così il vostro Dockerfile sarà simile:

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 

Questo risolto per me. Spero che funzionerà per te.

+0

In realtà, questa è una spiegazione molto buona. Grazie! Tuttavia, sul mio computer locale ho le installazioni modificabili in qualche altra directory, quindi sincronizzarle con il contenitore potrebbe essere troppo complicato ... – linkyndy

13

@mikexstudios è corretto, questo accade perché pip memorizza la sorgente del pacchetto in /usr/src/app/src, ma si sta montando una directory locale su di esso, il che significa che python non riesce a trovare il pacchetto sorgente.

Anziché modificare la posizione di WORKDIR, ho risolto cambiando il comando pip a:

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

approccio Ether dovrebbe funzionare.

2

Se si riceve un errore simile durante l'installazione di un repository git da un file dei requisiti in un contenitore con dock, è possibile che si sia dimenticato di installare git.

Qui è l'errore che ho ricevuto:

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 

Ecco un esempio Dockerfile che installa Git e quindi installa tutti i requisiti:

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 

Ora è possibile utilizzare pacchetti git nel file i requisiti in a Ambiente Dockerized

Problemi correlati