web-dev-qa-db-fra.com

Docker comment exécuter pip Requirements.txt uniquement en cas de changement?

Dans un fichier Docker, j'ai une couche qui installe requirements.txt:

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

Lorsque je construis l'image de menu fixe, il exécute l'ensemble du processus indépendamment de de toutes les modifications apportées à ce fichier.

Comment puis-je m'assurer que Docker ne tourne que pip install -r requirements.txt s'il y a eu une modification du fichier?

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))
53
Prometheus

Je suppose qu'à un moment donné de votre processus de construction, vous copiez l'intégralité de votre application dans l'image Docker avec COPY ou ADD:

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

Le problème est que vous invalidez le cache de génération Docker chaque fois que vous copiez l'application dans son intégralité dans l'image. Cela invalidera également le cache pour toutes les étapes de construction suivantes.

Pour éviter cela, je suggèrerais de copier seulement le requirements.txt fichier lors d’une étape de construction distincte avant d’ajouter l’application entière à l’image:

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

Comme le fichier de configuration requis lui-même ne change probablement que rarement, vous pourrez utiliser les couches en cache jusqu'au moment où vous ajoutez le code de votre application dans l'image.

109
helmbert

Ceci est directement mentionné dans le propre " Meilleures pratiques pour l'écriture de Dockerfiles " de Docker:

Si vous avez plusieurs étapes Dockerfile qui utilisent des fichiers différents de votre contexte, COPIEZ-les individuellement plutôt que tous en même temps. Cela garantira que le cache de construction de chaque étape n’est invalidé (ce qui oblige à réexécuter l’étape) si les fichiers spécifiquement requis changent.

Par exemple:

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

Cela entraîne moins d'invalidations de cache pour l'étape RUN que si vous mettez la commande COPY./tmp/avant.

27
jrc