Docker come eseguire pip requirements.txt solo se ci sono state modifiche?


98

In un Dockerfile ho un livello che installa requirements.txt:

FROM python:2.7
RUN pip install -r requirements.txt

Quando creo l'immagine docker, esegue l'intero processo indipendentemente da eventuali modifiche apportate a questo file.

Come posso assicurarmi che Docker venga eseguito solo pip install -r requirements.txtse è stata apportata una modifica al file?

Removing intermediate container f98c845d0f05
Step 3 : RUN pip install -r requirements.txt
 ---> Running in 8ceb63abaef6
Collecting https://github.com/tomchristie/django-rest-framework/archive/master.zip (from -r requirements.txt (line 30))
  Downloading https://github.com/tomchristie/django-rest-framework/archive/master.zip
Collecting Django==1.8.7 (from -r requirements.txt (line 1))

1
Pubblica l'output di docker build(e il tuo Dockerfile). Presumibilmente, è un passaggio precedente nel processo di compilazione che sta rompendo la cache, causando l'esecuzione di questo passaggio.
Thomas Orozco

aggiornamento OP con tutto ciò che ho al momento
Prometheus

1
Solo questo passaggio non è utile. Si prega di inviare la completa uscita (o almeno la Dockerfile).
Thomas Orozco

Risposte:


179

Presumo che a un certo punto del processo di compilazione tu stia copiando l'intera applicazione nell'immagine Docker con COPYo ADD:

COPY . /opt/app
WORKDIR /opt/app
RUN pip install -r requirements.txt

Il problema è che stai invalidando la cache di build Docker ogni volta che copi l'intera applicazione nell'immagine. Ciò invaliderà anche la cache per tutti i passaggi di build successivi.

Per evitare ciò, suggerirei di copiare solo ilrequirements.txt file in un passaggio di build separato prima di aggiungere l'intera applicazione all'immagine:

COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
COPY . /opt/app
# continue as before...

Poiché il file dei requisiti stesso probabilmente cambia solo raramente, sarai in grado di utilizzare i livelli memorizzati nella cache fino al punto in cui aggiungi il codice dell'applicazione nell'immagine.


8
Come linea guida generale, credo che COPYsia preferibile a ADDmeno che tu non abbia specificamente bisogno del comportamento di ADD.
Metropolis

2
@Metropolis, hai perfettamente ragione. Grazie per il suggerimento.
Helmbert

5
D'accordo con @Metropolis. ADDè necessario solo se la <src>cartella contiene un archivio che deve essere decompresso o deve supportare la gestione remota degli URL. {codice sorgente}
Mohsin

45

Questo è menzionato direttamente nelle " Migliori pratiche per la scrittura di Dockerfile " di Docker :

Se hai più passaggi Dockerfile che utilizzano file diversi dal tuo contesto, COPIA singolarmente, piuttosto che tutti in una volta. Ciò garantirà che la cache di build di ogni passaggio venga invalidata (costringendo il passaggio a essere rieseguito) solo se i file specificatamente richiesti cambiano.

Per esempio:

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

Si traduce in un minor numero di invalidamenti della cache per il passaggio ESEGUI, rispetto a quando si inserisce COPIA. / tmp / prima di esso.


0

In alternativa, come mezzo più rapido per eseguire il file requirements.txt senza digitare "sì" per confermare l'installazione delle librerie, puoi riscrivere come:

COPY requirements.txt ./
RUN pip install -y -r requirements.txt
COPY ./"dir"/* .
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.