La física del caché de compilación en Docker: tres almacenes, tres reglas

Fuentes: The physics of Docker build caching: three caches, three rules

Docker no utiliza un único sistema de caché durante la compilación de imágenes, sino al menos tres con vidas, reglas de invalidación y modos de fallo distintos. Comprender en cuál de ellos reside la ganancia real de cada proyecto es la clave para elegir una estrategia de caché eficaz, según un análisis técnico difundido por Blacksmith.

El primer nivel es la cadena de capas del Dockerfile: cada instrucción produce una capa y un cambio invalida la propia capa y todas las posteriores, una "ola" que recorre toda la cadena. Aquí aplica la regla de ordenar las capas para que el contenido que cambia con frecuencia quede por debajo de los pasos costosos y estables, como las dependencias: copiar primero el manifiesto, instalar, y luego el código fuente. Las mediciones en Go, Python, Rust, Node, Java y Bazel muestran que esta reorganización puede acelerar las builds con cambio de código entre 3 y 24 veces sin alterar el tiempo frío ni el tamaño de la imagen.

El segundo nivel son los montajes de caché declarados con RUN --mount=type=cache, que conservan estado del gestor de paquetes o del compilador entre compilaciones. Son los que hacen que la recompilación sea incremental en lugar de partir de cero, pero su contenido vive fuera del sistema de archivos de capas y, por tanto, no se exporta con los backends habituales (gha, registry, inline). En Rust, una cambio de dependencias cuesta 3,6 segundos con estado persistente, 164 segundos con el backend GHA y 19 segundos sin caché: el mecanismo de exportación resultó ocho veces más lento que no hacer nada.

El tercer nivel es la caché del propio demonio Docker, que almacena imágenes base, imágenes construidas y el contenido usado por docker run. Solo interviene en la capa FROM y nunca queda invalidado por la ola de capas. La conclusión práctica es que los backends de exportación cobran un impuesto de transferencia en cada compilación y solo compensan cuando la ganancia reside en capas y el caché es pequeño; cuando el valor está en los montajes, hace falta estado persistente en la máquina de compilación.