es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , , , ,

Answer

  1. Avatar for 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:

    1. Congele todas las dependencias generando un archivo requirements.txt bloqueado utilizando pip-tools. Esto se puede hacer ejecutando pip-compile en un archivo requirements.in, que lista todas las dependencias directas e indirectas de su proyecto. Este archivo requirements.in debe mantenerse bajo control de versiones.
    2. Use la instrucción COPY para copiar tanto requirements.in como requirements.txt al Dockerfile.

    COPY ./requirements.in /code/requirements.in
    COPY ./requirements.txt /code/requirements.txt
    
    1. Ejecute pip-compile --output-file=requirements.txt --rebuild --quiet requirements.in para regenerar requirements.txt. Esto actualizará requirements.txt con los paquetes más nuevos disponibles y también respetará cualquier restricción de versión especificada en requirements.in.

    2. 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.

    docker build --no-cache -t my-image .
    

    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 y requirements.txt no ha cambiado. Si se realizan cambios en requirements.in, deberá repetir los pasos 3-4 para regenerar requirements.txt y asegurarse de que se instalen las últimas dependencias.

Comments are closed.