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
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
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
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
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
Cómo quería subir la imagen a mi cuenta de DockerHub, ejecuté el build con el parámetro «–push».