En un Dockerfile tengo una capa que instala requirements.txt
:
FROM python:2.7
RUN pip install -r requirements.txt
Cuando construyo la imagen de la ventana acoplable, se ejecuta todo el proceso independientemente de los cambios realizados 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))
python
docker
dockerfile
Prometeo
fuente
fuente
docker build
(y suDockerfile
). Presumiblemente, es un paso anterior en su proceso de compilación el que está destruyendo el caché, lo que hace que se ejecute este paso.Respuestas:
Supongo que en algún momento de su proceso de compilación, está copiando toda su aplicación en la imagen de Docker con
COPY
oADD
:El problema es que invalida la caché de compilación de Docker cada vez que copia la aplicación completa en la imagen. Esto también invalidará la caché para todos los pasos de compilación posteriores.
Para evitar esto, sugiero copiar solo el
requirements.txt
archivo en un paso de compilación separado antes de agregar la aplicación completa a 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 archivo de requisitos en sí mismo probablemente cambia solo en raras ocasiones, podrá usar las capas almacenadas en caché hasta el momento en que agregue el código de su aplicación a la imagen.
fuente
COPY
se prefiere aADD
menos que necesite específicamente el comportamiento deADD
.ADD
solo es necesario si la<src>
carpeta contiene algún archivo que deba descomprimirse o sea compatible con el manejo remoto de URL. {código fuente}Esto se menciona directamente en las " Mejores prácticas para escribir Dockerfiles " de Docker :
fuente
Alternativamente, como un medio más rápido para ejecutar el archivo requirements.txt sin escribir "sí" para confirmar la instalación de las bibliotecas, puede volver a escribir como:
COPY requirements.txt ./ RUN pip install -y -r requirements.txt COPY ./"dir"/* .
fuente