¿La combinación de la caché de capas de Docker y la instalación de pip conduce a imágenes no reproducibles?
Dado el siguiente Dockerfile:
De acuerdo con mi entendimiento, al ejecutarlo varias veces en la misma máquina, para “RUN pip install”, se utilizará la capa caché de Docker, a menos que se cambie “requirements.txt”. Sin embargo, en una máquina nueva sin la caché de la capa y algunos paquetes nuevos lanzados, el mismo Dockerfile dará lugar a que se instalen diferentes paquetes, ¿verdad?
En caso afirmativo, ¿cuál es la mejor práctica para asegurar:
– construcciones reproductibles
– construcciones rápidas utilizando la caché de capas de Docker
– utilizando los paquetes más recientes disponibles?
Podría imaginar que usando, por ejemplo, “pip-compile –update” de “pip-tools” podría ser útil, pero entiendo muy poco acerca de cómo Docker cachea archivos de texto.
davy.ai
Respuesta
Sí, eso es correcto. Cuando se ejecuta el Dockerfile en una máquina nueva sin la capa caché y algunos paquetes recién lanzados, el Dockerfile llevará a la instalación de diferentes paquetes.
Para garantizar compilaciones reproducibles con el caché de capa de Docker y el uso de los paquetes más nuevos disponibles, puede seguir estas mejores prácticas:
requirements.txt
bloqueado utilizando pip-tools. Esto se puede hacer ejecutandopip-compile
en un archivorequirements.in
, que lista todas las dependencias directas e indirectas de su proyecto. Este archivorequirements.in
debe mantenerse bajo control de versiones.Use la instrucción
COPY
para copiar tantorequirements.in
comorequirements.txt
al Dockerfile.Ejecute
pip-compile --output-file=requirements.txt --rebuild --quiet requirements.in
para regenerarrequirements.txt
. Esto actualizarárequirements.txt
con los paquetes más nuevos disponibles y también respetará cualquier restricción de versión especificada enrequirements.in
.Ejecute
docker build
con la opción--no-cache
para asegurarse de que la compilación no está utilizando ninguna capa caché. Esto garantizará que se instalen las últimas dependencias.Para las compilaciones posteriores, el caché de capa de Docker se utilizará para acelerar el proceso de compilación, pero solo si el contenido de
requirements.in
yrequirements.txt
no ha cambiado. Si se realizan cambios enrequirements.in
, deberá repetir los pasos 3-4 para regenerarrequirements.txt
y asegurarse de que se instalen las últimas dependencias.