does not match the detected host platform (linux/amd64)

Tratando o problema “WARNING: The requested image’s platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested” ao tentar build de imagem no MacOS

Você está tentando buildar uma imagem no MacOS e se depara com o erro: “WARNING: The requested image’s platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform”? Este é um problema comum enfrentado por desenvolvedores que trabalham com containers Docker em um ambiente MacOS com arquitetura ARM. Neste artigo, vamos explorar as causas desse erro e como resolvê-lo de maneira eficaz.

does not match the detected host platform (linux/amd64)

Erro

WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
standard_init_linux.go:228: exec user process caused: exec format error

O erro ocorre durante o uso docker run, por exemplo:

docker run --rm -p 9000:9000 1234567.dkr.ecr.us-east-1.amazonaws.com/devops-mind:laravel-1  

Solução

Foi necessário buildar a imagem a partir de uma estação com Linux, ao invés de macOS.

Porém esta solução não é muito prática. Nos próximos tópicos iremos abordar opções mais práticas e efetivas.

Entendendo o Problema

O que Causa o Erro?

O erro ocorre porque o MacOS mais recente usa processadores Apple Silicon (ARM), enquanto muitas imagens Docker são construídas para a arquitetura x86_64 (amd64). Quando você tenta executar uma imagem ARM em um host amd64, o Docker não consegue compatibilizar as plataformas automaticamente.

Por Que Isso é Importante?

Resolver este problema é crucial para garantir que seu ambiente de desenvolvimento esteja alinhado com as práticas de produção e para evitar interrupções no fluxo de trabalho. Além disso, compreender a compatibilidade entre diferentes arquiteturas ajuda a otimizar o uso de containers em diversas plataformas.

Solução para o Erro – does not match the detected host platform (linux/amd64)

Verificando a Arquitetura do Seu Sistema

Antes de tudo, confirme qual é a arquitetura do seu MacOS. Você pode fazer isso usando o seguinte comando no terminal:

uname -m

Este comando retornará arm64 para Apple Silicon e x86_64 para Intel.

Ajustando a Plataforma no Docker

A maneira mais direta de resolver o problema é especificar a plataforma ao buildar ou puxar a imagem Docker. Você pode fazer isso adicionando a flag --platform ao comando Docker:

docker build --platform linux/amd64 -t nome_da_imagem .

Utilizando a Ferramenta buildx

O Docker oferece uma ferramenta chamada buildx que facilita a criação de imagens multiplataforma. Siga os passos abaixo para utilizá-la:

  1. Instale o buildx:
   docker buildx install
  1. Configure o buildx:
   docker buildx create --use
  1. Build a imagem para a plataforma específica:
   docker buildx build --platform linux/amd64 -t nome_da_imagem .

Esta abordagem garante que a imagem seja construída de forma compatível com a arquitetura amd64, mesmo em um host arm64.

Exemplos Práticos

Buildando uma Imagem Laravel

Vamos supor que você tenha um Dockerfile para uma aplicação Laravel. Veja como você pode ajustá-lo para especificar a plataforma:

# Use a imagem base do PHP
FROM --platform=linux/amd64 php:7.4-fpm

# Set up o ambiente Laravel
WORKDIR /var/www

# Copie os arquivos do Laravel
COPY . .

# Instale as dependências do Composer
RUN composer install

# Expõe a porta da aplicação
EXPOSE 9000

# Comando para iniciar o PHP-FPM
CMD ["php-fpm"]

E então, execute o comando build:

docker buildx build --platform linux/amd64 -t laravel_app .

Alternativa: Usando Imagens Multiplataforma

Algumas imagens Docker já são disponibilizadas em multiplataforma. Você pode verificar se uma imagem suporta multiplataformas usando o comando:

docker manifest inspect nome_da_imagem

Se a imagem suportar arm64 e amd64, o Docker gerenciará automaticamente a plataforma correta para o seu host.

Considerações Finais

Benefícios de Usar Build Multiplataforma

  • Compatibilidade: Garantir que sua aplicação rodará em diferentes arquiteturas.
  • Flexibilidade: Facilitar o desenvolvimento em ambientes diversos sem alterações significativas no código.
  • Desempenho: Otimizar a performance ao utilizar a arquitetura nativa do sistema.

Dicas Adicionais

  • Mantenha seu Docker atualizado para ter acesso às últimas funcionalidades e correções.
  • Considere o uso de ferramentas de CI/CD que suportam build multiplataforma, como GitHub Actions ou GitLab CI.

Conclusão

Enfrentar o erro “The requested image’s platform (linux/arm64) does not match the detected host platform (linux/amd64)” pode ser desafiador, mas com as técnicas e ferramentas corretas, você pode resolvê-lo de maneira eficiente. Adotar práticas de build multiplataforma não só resolve esse problema, mas também prepara seu ambiente de desenvolvimento para ser mais robusto e flexível. Continue explorando e ajustando seu setup para tirar o máximo proveito do Docker em qualquer plataforma.


Quer aprender mais?

Não deixe de se inscrever na nossa newsletter para receber as últimas novidades e dicas sobre DevOps/SRE diretamente no seu e-mail:

Receba as notícias por email

* campo obrigatório

Além disso, leia nossos outros posts sobre Linux e Docker, para aprender cada vez mais e continuar aprimorando suas habilidades em DevOps.

Compartilhe / Share
Fernando Müller Junior
Fernando Müller Junior

Eu sou o Fernando Müller, um Tech Lead SRE com 16 anos de experiência em TI, atualmente eu trabalho na Appmax, uma fintech localizada no Brasil. Apaixonado por trabalhar com arquiteturas e aplicações Cloud Native, ferramentas Open Source e tudo que existe no mundo SRE, sempre procurando se desenvolver e aprender constantemente(Lifelong learning), atuando em projetos inovadores!

Artigos: 37

Receba as notícias por email / Receive news by email

Insira seu endereço de e-mail abaixo e assine nossa newsletter / Enter your email address below and subscribe to our newsletter

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *