Como distribuir código para rodar em diversas arquiteturas? R: Docker buildx
Intro
Caso você não conheça Docker... Como veio parar aqui?
Mas, mesmo assim, caso não conheça, recomendo ler/ver/ouvir os seguintes conteúdos e antes de continuar a leitura, dê a cara a tapa e faça um minimum viable product (MVP) de alguma coisa em Docker -- ainda irei publicar alguns exemplos maneiros de deploy de webapps rodando Shiny e análise de dados com R -- que você se sentir mais confortável com:
Agora, caso já conheça Docker e tenha feito algo com ele, podemos falar de buildx; mas antes, gostaria de colocar alguns cenários:
- "Você tem um computador antigo, um Intel 32bits e gostaria de usar ele como um servidor na sua casa para poder rodar algumas das suas aplicações. O contra ponto é que gostaria de desenvolver de qualquer lugar a qualquer hora."
- "Você tem uma Raspberry Pi e gostaria de colocar ela para bom uso."
- "Sabendo que serviços na nuvem começaram a apresentar serviços com processadores ARM, que possuem custos mais baixos, você decide querer reduzir os custos da sua empresa."
Considerando que os dois últimos cenários tem a ver com a arquitetura ARM -- que eu pretendo escrever cada vez mais aqui sobre --, elas podem parecer "a mesma coisa" em uma análise rápida na verdade elas apresentam considerações diferentes. Mas um até mesmo um cenário extra talvez te ajude a entender melhor o potencial:
- "Está cansado de a cada 10-15 a Apple mudar de arquitetura e com receio de novo futuro eles decidirem mudar para um RISC-V ou coisa do tipo?"
Okay, este último é mais um chute do que algo certo ou que tenha algum embasamento atual... Mas seria fácil injetar um QEMU com tal arquitetura e, da noite para o dia, ter toda a sua aplicação atual estar rodando para outra arquitetura -- com pequenas para quase nenhuma alteração dependendo do cenário.
O buildx
O buildx em termos simples: "é que uma camada de abstração do hardware para que o Docker consiga construir uma imagem de uma arquitetura em outra."
Você pode ver, em ciclo de vida de um produto, o buildx como a previdência privada: você faz hoje mas pensando no futuro.
Como configurar ele na sua máquina
Caso queria um script "pronto" para rodar apenas e começar a desenvolver para multiplas arquiteturas, recomendo este daqui que acabei montando durante alguns meses.
Caso tenha algum receio de que seu tempo de build vai começar a demorar demais ou consumir energia demais, só lembrar que mesmo com o suporte para compilar para várias arquiteturas você escolhe quais vai querer, fora que sempre vou recomendar procurar dar um docker build --help
para ver pode utilizar mais cores da sua máquina, caso tenhas essa possibilidade. Lembre-se: "o Docker é seu amigo".
Como rodar agora?
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --push --tag <seuUsuarioNoRepositorio>/<seuProjeto> .
Este é um exemplo simples de um comando que eu rodo para algumas de aplicações de uso pessoal e empresarial que mantenho. Todavia é importante comentar outra vantagem do buildx que é a aglutinação de comando, uma vez que os antigos docker tag
e docker push
agora podem ser passados como flags e fazendo um comando três etapas do desenvolvimento serem chamadas com apenas um comando.
Algumas outras plataformas atualmente suportadas são:
- linux/arm/v6
- linux/386
- linux/ppc64le
- linux/s390x
Como saber se a minha aplicação vai funcionar em algo diferente do meu x86?
A grande dúvida, mas também tem a pior resposta de todas... "Depende".
Atualmente não tenho problemas em compilar para ARM mas isso porque normalmente utilizo imagens que possuem um bom suporte para linguagens como Node e Python; todavia, caro queira ir mais além, além de uma stack e subir soluções mais complexas, recomendo dar uma olhada no Alpine para construir suas imagens.
Exemplo de aplicações
Atualmente eu mesmo já desenvolvo e rodo três aplicações minhas -- bots para Telegram -- desta maneira. Resolvi parar de pagar os US$: 5 por aplicação -- o que daria aproximadamente 80 reais -- por mês para rodar na minha Single Board Computer (SBC) -- as famosas "plaquinhas" -- que está rodando os três serviços e muito mais, tudo isso conectado a um carregador de celular. Caso queira ver mais sobre elas:
Agora, o que você pode contruibir e rodar além disso graças a ferramentas como buildx?
Vantagens
Ter a sua própria nuvem e a garantia de que seus dados são seus mesmo, vai muito além de qualquer LGPD ou coisa do tipo. Poder também bloquear propagandas e rastreamento também é algo que vai além do que muita lei pode fazer ou já fez para você.
Pontos importantes
Caso goste de desafios e quebrar a cabeça em muitos pontos, procure compilar todas as suas aplicações daqui para frente dando suporte para todas as arquiteturas, mesmo que não use. O seu trabalho pode ajudar outros com um script apenas. E a tecnologia quanto mais ela se tornar acessível, maior o potencial dela fazer a diferença na vida de outras pessoas que até então não tinham o acesso fácil a ela.
Referências
- "Docker-4" by maijou2501 is licensed under CC BY-SA 2.0
- "Rolled up Blueprints Home Construction" by ShebleyCL is licensed under CC BY 2.0
- "Falling Wheel" by cogdogblog is licensed under CC BY 2.0
- "CPU Processor" by danielfoster437 is licensed under CC BY-NC-SA 2.0
- "Chain; May Be Removed" by Hamedog is licensed under CC BY-ND 2.0