Como construir una imagen multiarch con docker-buildx

Hace poco tuve la oportunidad de tener acceso a un clúster de raspberry pi ejecutando k3s, que es una distribución de kubernetes especializada en IoT y edge computing.

Me pareció muy interesante y decidí probar a desplegar alguna aplicación que ya tenía “conteinarizada” y que ya había desplegado previamente en k8s.

Sin embargo, me encontré con un detalle, y es que la imagen que había generado previamente no era compatible con este ambiente, debido a fue compilada usando un procesador con arquitectura x86_64, mientras que dicho clúster al estar formado por placas raspberry pi corre sobre una arquitecta ARM.

Afortunadamente docker nos permite crear imágenes compatibles con varias arquitecturas.

A continuación voy a describir cómo crear una imágen compatible con ARM desde una PC con procesador Intel/amd.

Para crear una imagen multiarch es necesario instalar docker-buildx:

wget https://github.com/docker/buildx/releases/download/v0.6.2/buildx-v0.6.2.linux-amd64
mkdir -p ~/.docker/cli-plugins/
mv buildx-v0.6.2.linux-amd64 ~/.docker/cli-plugins/docker-buildx

Una vez instalado docker-buildx instalamos todas las arquitecturas disponibles:

docker run -it --rm --privileged tonistiigi/binfmt --install all

Podemos consultar las arquitecturas instaladas:

docker buildx ls

Por último la compilación de la imagen se realiza con buildx (el comando es muy parecido a realizar un build normal)

docker buildx build --platform linux/amd64,linux/armhf  -t myuser/imagename:tag --push .

Cómo puedes ver, usaremos el parámetro --platform para especificar las arquitecturas con las que será compatible nuestra imagen.

Listo, ahora puedes ejecutar tu imagen en un clúster con procesador ARM

Etiquetas
Like