Docker cómo ejecutar los requisitos de pip.txt solo si hubo un cambio?


En un Dockerfile tengo una capa que instala requirements.txt:

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

Cuando compilo la imagen de docker, ejecuta todo el proceso independientemente de de cualquier cambio realizado en este archivo.

¿Cómo me aseguro de que Docker solo se ejecute pip install -r requirements.txt si ha habido un cambio en el archivo?

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))
Author: Prometheus, 2015-12-21

2 answers

Asumo que en algún momento de su proceso de compilación, está copiando toda su aplicación en la imagen de Docker con COPY o ADD:

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

El problema es que está invalidando la caché de compilación de Docker cada vez que está copiando toda la aplicación en la imagen. Esto también invalidará la caché para todos los pasos de compilación posteriores.

Para evitar esto, sugeriría copiar solo el requirements.txt archivo en un paso de compilación separado antes de agregar el aplicación en la imagen:

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

Como el propio archivo de requisitos probablemente solo cambia raramente, podrá usar las capas almacenadas en caché hasta el punto en que agregue el código de su aplicación a la imagen.

 59
Author: helmbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-09 13:36:09

Esto se menciona directamente en el propio Docker " Mejores prácticas para escribir archivos Docker":

Si tiene varios pasos de Dockerfile que usan archivos diferentes de su contexto, COPIARLOS individualmente, en lugar de todos a la vez. Este se asegurará de que la caché de compilación de cada paso solo se invalide (forzando el paso que se debe volver a ejecutar) si cambian los archivos requeridos específicamente.

Por ejemplo:

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

Resulta en menos invalidaciones de caché para la EJECUCIÓN paso, que si pones copia . /tmp/ antes.

 13
Author: jrc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-09 21:21:17