Cómo construir una imagen en Azure Container Registry usando BuildKit

Una de las capacidades que nos ofrece Azure Container Registry es que podemos construir directamente en él nuestras imágenes, sin que tengamos que tener Docker instalado en nuestro local o incluso, como es mi caso a veces, que tengamos la arquitectura o sistema operativo que necesitamos. Varias veces me ha pasado que estoy trabajando en mi Macbook pro, que es M1, y al ser arquitectura ARM no me sirven las imágenes que genero más allá de mis pruebas en local. Por otro lado, también me ha ocurrido que he necesitado generar alguna imagen que depende de BuildKit y utilizando directamente az acr build no funciona, porque no está establecido DOCKER_BUILDKIT=1 en ningún sitio. En este artículo, súper corto, te comparto cómo lo he solucionado, ya que me ha llevado algún ratito encontrar la solución 😙

Tareas avanzadas en Azure Container Registry para usar BuildKit

En este registro existen dos formas de ejecutar tareas: la simple (o rápida), que es a través de ese az acr build y luego una más avanzada (o multi-step) que nos permite añadir pasos, secretos, variables, etcétera. Si lo que necesitas es lanzar el comando build haciendo uso de BuildKit necesitas hacer uso de esta segunda opción.

Para que lo veas con un ejemplo, en mi proyecto de Backstage, del cual estoy hablando intensamente en mi canal de YouTube 🎥, en mi serie sobre Platform Engineering, que tiene esta estructura:

.
├── backstage
├── .devcontainer
├── .env
├── .git
├── .github
├── .gitignore
└── README.md

En la carpeta backstage, he añadido un archivo llamado acr-task.yaml, el cual contiene lo siguiente:

version: v1.1.0
steps:
  - build: -t $Registry/backstage:$ID -f packages/backend/Dockerfile .
    env: 
      - DOCKER_BUILDKIT=1
  - push: 
    - "$Registry/backstage:$ID"

Como ves, la estructura es bastante sencilla: Simplemente especifico la versión del esquema de este tipo de tareas y luego puedo establecer una serie de pasos. En este caso solo tengo dos: el primero de ellos es la ejecución del comando build donde le digo cómo quiero que sea el nombre de la imagen y luego también dónde está el Dockerfile y qué ubicación quiero usar como contexto. Además, como parte de esta tarea configuro como variable de entorno DOCKER_BUILDKIT=1 la cual es la que me va a permitir que pueda usar este durante la generación de la imagen. Una vez que termine con este proceso simplemente hago push del resultado al registro donde se ha ejecutado la tarea.

Para poder ejecutar esta tarea, ahora desde la raíz de mi proyecto puedo lanzar el siguiente comando:

az acr run -f acr-task.yaml --registry $ACR_NAME ./backstage

Y ya está 😃

¡Saludos!