BuildKit es una herramienta poderosa y a menudo subestimada dentro del ecosistema de Docker. Aunque la mayoría de los usuarios interactúan con ella indirectamente a través del comando docker build, su función va mucho más allá de simplemente interpretar Dockerfiles. En esencia, BuildKit es un marco de trabajo de construcción de propósito general y altamente extensible, capaz de generar no solo imágenes de contenedor OCI, sino también archivos tar, directorios locales, paquetes APK, RPMs y cualquier otro resultado que pueda definirse como un grafo dirigido acíclico (DAG) de operaciones del sistema de archivos.
La clave de su funcionamiento reside en el concepto de LLB (Low-Level Build definition), que actúa como una representación intermedia de la construcción, similar al LLVM IR en el mundo de la compilación. Esta representación es content-addressable, lo que significa que las operaciones idénticas generan hashes idénticos, permitiendo un caching agresivo y eficiente. BuildKit no se limita a interpretar Dockerfiles; los 'frontends' son contenedores que convierten diferentes formatos de definición de construcción (YAML, JSON, HCL, etc.) a LLB, permitiendo una gran flexibilidad en la forma en que se definen los procesos de construcción. La directiva # syntax= en un Dockerfile indica qué frontend usar, y se puede personalizar para utilizar cualquier imagen de contenedor.
La fase de 'solver' toma este grafo LLB y lo ejecuta, aprovechando el caching a nivel de operación y la ejecución en paralelo de ramas independientes, lo que resulta en construcciones significativamente más rápidas y reproducibles. El cache puede ser local, inline (dentro de la imagen) o remoto (en un registro). Además, BuildKit ofrece la posibilidad de especificar el tipo de salida (--output), permitiendo generar archivos tar, directorios locales o incluso APKs sin necesidad de crear una imagen de contenedor.
Un ejemplo concreto de esta flexibilidad es apkbuild, un frontend personalizado que BuildKit utiliza para construir paquetes Alpine APK a partir de una especificación YAML, demostrando que no es necesario un Dockerfile para aprovechar el poder de BuildKit. Proyectos como Earthly, Dagger y Depot ya están utilizando BuildKit como base para sus propias herramientas, validando su escalabilidad y robustez. En resumen, BuildKit ofrece una solución de construcción content-addressable, paralela y con caching integrado, liberando a los desarrolladores de la necesidad de reinventar la rueda y permitiéndoles centrarse en la lógica de construcción en sí misma.
