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