Criando imagens Docker para arquitetura ARM
Neste breve artigo, eu mostro o que é preciso para criar uma imagem Docker ARM a partir de um Ubuntu x86-64.
Motivação
Atualmente, eu tenho um pequeno cluster Kubernetes utilizando o K3S, o cluster está instalado em uma máquina de arquitetura ARM e tive alguns problemas ao tentar gerar imagens para esta plataforma. A arquitetura da minha máquina é x86-64 e o alvo seria uma arquitetura ARM.
Recursos necessários
Primeiramente é necessário possuir o Docker instalado na sua máquina. Além disso, é necessário instalar algumas dependências do sistema para podermos emular o ambiente ARM, uma vez que estamos utilizando um Ubuntu x86-64. A dependência em questão é o Qemu que utiliza o KVM para virtualizar o ambiente ARM.
sudo apt install -y qemu-user-static binfmt-support
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
Docker Build
Em um cenário convencional, um comando para gerar uma imagem docker seria algo semelhante ao formato abaixo, o comando uma imagem chamada your-registry/image-name
:
docker build -t your-registry/image-name -f path/Dockerfile .
Caso você queira compilar o Dockerfile para uma arquitetura diferente, será necessário trocar o comando docker build
pelo comando docker buildx build
, como mostrado abaixo:
docker buildx build --platform linux/arm64 --push -t your-registry/image-name -f path/Dockerfile .
Você pode reparar que foram incluídos alguns parâmetros novos:
buildx build
- Comando para build cross-plataforma--platform linux/arm64
- Especifica a arquitetura desejada--push
- É necessário informar para o docker não apenas gerar, mas também publicar a imagem no registry, uma vez que as imagens não são acessíveis viadocker push
.
Dica adicional
Tenha paciência, porque a virtualização proporciona uma build extremamente lento. Em alguns testes realizados, o build demorou 5 vezes mais que o formato convencional.