caching - navegadores - memoria cache de sombreadores amd
¿Cómo sabe Docker cuándo usar el caché durante una compilación y cuándo no? (2)
El proceso de creación de la memoria caché se explica con bastante docs.docker.com/engine/userguide/eng-image/… en la docs.docker.com/engine/userguide/eng-image/…
Comenzando con una imagen base que ya está en el caché, la siguiente instrucción se compara con todas las imágenes secundarias derivadas de esa imagen base para ver si una de ellas se creó utilizando la misma instrucción. Si no, el caché se invalida.
En la mayoría de los casos, basta con comparar la instrucción en el
Dockerfile
con una de las imágenes secundarias. Sin embargo, ciertas instrucciones requieren un poco más de examen y explicación.Para las instrucciones
ADD
yCOPY
, se examina el contenido de los archivos en la imagen y se calcula una suma de comprobación para cada archivo. Los tiempos de los archivos modificados por última vez y de los últimos accesos no se consideran en estas sumas de comprobación. Durante la búsqueda de caché, la suma de comprobación se compara con la suma de comprobación en las imágenes existentes. Si algo ha cambiado en los archivos, como el contenido y los metadatos, la memoria caché se invalida.Aparte de los comandos
ADD
yCOPY
, la comprobación de la memoria caché no examinará los archivos en el contenedor para determinar la coincidencia de la memoria caché. Por ejemplo, al procesar un comandoRUN apt-get -y update
los archivos actualizados en el contenedor no se examinarán para determinar si existe un acierto de caché. En ese caso, solo la cadena de comandos se utilizará para encontrar una coincidencia.Una vez que se invalida la memoria caché, todos los comandos de
Dockerfile
subsiguientes generarán nuevas imágenes y la memoria caché no se utilizará.
Se encontrará con situaciones en las que los paquetes del sistema operativo, los paquetes NPM o un repositorio de Git se actualizan a las versiones más recientes (por ejemplo, ~2.3
semver en package.json
), pero como su Dockerfile
o package.json
no se han actualizado, la Dockerfile
acoplable continuará usando el caché .
Es posible generar programáticamente un Dockerfile
que Dockerfile
el caché modificando líneas en ciertas verificaciones más inteligentes (por ejemplo, recuperar el último shasum de rama de git de un repositorio para usar en la instrucción de clonación). También puede ejecutar la compilación periódicamente con --no-cache=true
para imponer las actualizaciones.
Me sorprende lo bien que funciona el almacenamiento en caché de capas de Docker, pero también me pregunto cómo determina si puede usar una capa en caché o no.
Tomemos estos pasos de compilación, por ejemplo:
Step 4 : RUN npm install -g node-gyp
---> Using cache
---> 3fc59f47f6aa
Step 5 : WORKDIR /src
---> Using cache
---> 5c6956ba5856
Step 6 : COPY package.json .
---> d82099966d6a
Removing intermediate container eb7ecb8d3ec7
Step 7 : RUN npm install
---> Running in b960cf0fdd0a
Por ejemplo, ¿cómo sabe que puede usar la capa en caché para npm install -g node-gyp
pero crea una capa nueva para la npm install
?
Se debe a que su archivo package.json
ha sido modificado, vea Removing intermediate container
.
Esa es también la razón por la que los archivos de información del administrador de paquetes (proveedores / terceros) son COPY
''ed primero durante la docker build
. Después de eso, ejecuta la instalación del administrador de paquetes y luego agregas el resto de tu aplicación, es decir, src
.
Si no ha realizado cambios en sus bibliotecas, estos pasos se sirven desde la memoria caché de compilación.