Categorías
20.04 22.04 24.04 Docker HowTos

Docker build para generar imágenes x64 y arm64 (docker-buildx)

Me puse como objetivo extender una imagen de MariaDB e incluirle un script que me haga backup todos los días. Así ya despliego el motor con un tema resuelto. La voy a utilizar en una raspberry pero quiero tener la posibilidad de correrla en mi pc (un amd64). ¿Cómo hago docker build para generar imágenes x64 y arm64?

Esto me hizo cruzar un laberinto de documentos y foros que me llevo un par de horas desandar, en base a la información que encontré pude armar un procedimiento relativamente simple.

Después de leer y revisar varios documentos llegue a comprender que es factible compilar binarios de otras plataformas utilizando QEMU como emulador.

Ref: https://collabnix.com/building-arm-based-docker-images-on-docker-desktop-made-possible-using-buildx/
Ref: https://www.stereolabs.com/docs/docker/building-arm-container-on-x86/

Asumo que ya tenemos docker andando en el equipo siguiendo el procedimiento «Instalar docker en Ubuntu para entornos de desarrollo.«.

Ya tenía un dockerfile creado (voy a hacer un post con eso también) desde el cual quería crear la imagen de un contenedor.

Sin más preámbulos vamos a poner dedos en teclado:

Procedimiento:

El primer paso es instalar los paquetes para desplegar QEMU en nuestro equipo.

sudo apt install qemu qemu-system-arm qemu-user-static binfmt-support docker-buildx

Para verificar que todo haya quedado bien podemos ejecutar el siguiente comando y debemos encontrar un archivo que muestre una información similar a esta captura

cat /proc/sys/fs/binfmt_misc/qemu-ppc
Salida del comando "cat /proc/sys/fs/binfmt_misc/qemu-ppc".
Salida del comando «cat /proc/sys/fs/binfmt_misc/qemu-ppc».

El siguiente paso es verificar que bootstrap de docker vea las nuevas arquitecturas disponibles.

sudo docker buildx inspect --bootstrap

Con los prerequisitos satisfechos ahora vamos a proceder a trabajar sobre el driver que va a compilar nuestros contenedores

Para compilar el múltiples plataformas debemos usar la opción buildx de docker (forma parte de los plugins que instalamos).

sudo docker buildx ls
Salida de la ejecución del comando "sudo docker buildx ls".
Salida de la ejecución del comando «sudo docker buildx ls».

Vemos en la captura que ya lista otras plataformas para compilar.

Vamos a probar compilar algo para arm64

sudo docker buildx build --platform linux/arm64 /mnt/storage/dockerfiles/mariadb-10.6-focal-auto-backups/ -t fsismo/mariadb-10.6-focal-auto-backups:latest -t fsismo/mariadb-10.6-focal-auto-backups:v0.2

Podemos por ejemplo compilar una imagen para arm sobre mi terminal

Salida del comando "sudo docker buildx build --platform .... "
Salida del comando «sudo docker buildx build –platform …. «

Excelente, funciona pero si quiero compilar dos plataformas al mismo tiempo me da error.

sudo docker buildx build --platform linux/amd64,linux/arm64 /mnt/storage/dockerfiles/mariadb-10.6-focal-auto-backups/ -t fsismo/mariadb-10.6-focal-auto-backups:latest -t fsismo/mariadb-10.6-focal-auto-backups:v0.2

El error me dice que tengo que utilizar un «driver» diferente y que al mismo lo tengo que crear.

Esto lo hago ejecutando los siguientes pasos:

sudo docker buildx create --name multibuilder
sudo docker buildx use multibuilder
sudo docker buildx ls
La salida del «sudo docker buildx ls» nos muestra que hay un nuevo driver disponible.

Ahora procedemos a probar que podamos compilar las dos arquitecturas al mismo tiempo. En la captura incorporé el parámetro –push para que suba las imágenes resultantes a dockerhub.

sudo docker buildx build --platform linux/amd64,linux/arm64 /mnt/storage/dockerfiles/mariadb-10.6-focal-auto-backups/ -t fsismo/mariadb-10.6-focal-auto-backups:latest -t fsismo/mariadb-10.6-focal-auto-backups:v0.2
La salida del comando «sudo docker buildx build –platform linux/amd64,linux/arm64 …»

Cómo quería subir la imagen a mi cuenta de DockerHub, ejecuté el build con el parámetro «–push».

Captura de pantalla de las imágenes creadas y subidas en dockerhub.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.