Build de imagem Docker para múltiplas arquiteturas
Para executar uma imagem Docker, é necessário que ela seja compatível com a arquitetura das máquinas que serão utilizadas (x86_64 ou arm64).
Considerando um cenário de computação em cloud pública, como a AWS por exemplo, podemos variar a arquitetura das máquinas utilizadas com uma certa frequência, inclusive variar a arquitetura das máquinas utilizadas em diferentes nodes dentro de um mesmo cluster EKS.
Visando tornar nossa imagem Docker mais versátil, podemos optar por realizar o build da imagem para múltiplas arquiteturas, atendendo assim todos os cenários desejados. Aqui irei realizar o build de um imagem Docker tanto para a arquitetura linux/amd64 quanto para linux/arm64.
Configuração do driver do Buildx
Por padrão o docker buildx usa o driver docker que não suporta a construção simultânea de imagens para múltiplas arquiteturas (cross-compilation).
Para construir a imagem Multi-Arquitetura (linux/amd64, linux/arm64), é necessário mudar o driver para um que suporte recursos avançados, como o driver docker-container, que usa uma builder instance baseada em containers.
1 Criar um novo Builder
Crie uma nova instância de builder chamada multiarch (ou o nome que preferir) usando o docker-container.
docker buildx create --name multiarch --driver docker-container --use
- '--name multiarch': Nomeia a nova instância.
- '--driver docker-container': Força o uso de um builder baseado em container, que é o que permite a compilação multi-arquitetura.
- '--use': Define esta nova instância como o builder ativo imediatamente.
2 Verificar o status do Builder
Confirme que o novo builder está ativo.
docker buildx inspect --bootstrap
3 Execute o Build Multi-Arquitetura
Utilizando o seguinte comando como exemplo, realize o build da imagem Docker.
docker buildx build --platform linux/amd64,linux/arm64 -t <image-name>:latest --push .
4 Limpeza (Opcional)
4.1 Retorne ao Builder padrão
docker buildx use default
4.2 Remover instância do Builder multiarch
docker buildx rm multiarch