Erro “WARNING: the requested image platform linux amd64 does not match does not match the detected host platformlinux arm64 v8 and no specific platform was requested ”: Como resolver

Ao tentar buildar uma imagem do PHP no MacOS, é comum se deparar com o erro WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform / linux arm64 v8 and no specific platform was requested. Esse erro pode ser frustrante e impedir o progresso do seu desenvolvimento. Neste artigo, exploraremos as causas desse erro e como resolvê-lo, realizando o build da imagem PHP com o uso do Rosetta por debaixo dos panos ou a partir de uma estação com Linux, em vez de usar MacOS.

linux arm64 v8 and no specific platform was requested

Entendendo o Erro

A Detecção do Host Platform

Quando você tenta buildar uma imagem no Docker, ele verifica a plataforma do host (no caso do MacOS, linux/amd64) e a plataforma da imagem solicitada (linux/arm64). O erro “the requested image platform linux amd64 does not match the detected host platform” ocorre quando há uma incompatibilidade entre essas plataformas.

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:php-1 
Exemplo do 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 Papel das Arquiteturas Diferentes

Arquiteturas diferentes, como amd64 e arm64, representam diferentes conjuntos de instruções que os processadores usam. Macs mais recentes com chips Apple Silicon (M1 e M2) utilizam a arquitetura arm64, enquanto muitos Containers e imagens são construídos para amd64. Essa incompatibilidade pode causar o erro mencionado.

Por Que MacOS Apresenta Esse Problema

MacOS, especialmente em máquinas com Apple Silicon, não é a plataforma mais amigável para buildar imagens Docker que não foram otimizadas para arm64. A falta de suporte nativo pode resultar em vários problemas, incluindo o erro linux arm64 v8 and no specific platform was requested e semelhantes:

the requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
warning: the requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
the requested image's platform (linux/amd64) does not match the detected host platform
the requested image's platform (linux/amd64)
warning: image platform (linux/amd64) does not match the expected platform (linux/arm64)
and no specific platform was requested
the requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8)
warning: the requested image's platform (linux/amd64) does not match the detected host platform
warning: the requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested
image platform (linux/amd64) does not match the expected platform (linux/arm64)

Solução1: Usando o Rosetta 2 para build do Container PHP amd64 em macOS ARM

Para resolver esse problema de incompatibilidade, você pode usar o Rosetta 2, uma tecnologia desenvolvida pela Apple que permite a emulação de arquiteturas x86 em sistemas baseados em ARM. Isso significa que você pode executar aplicativos e imagens Docker construídos para arquiteturas amd64 em um host macOS com CPU ARM.

Aqui estão os passos para usar o Rosetta 2 para resolver o erro “exec format error”:

  1. Instale o Rosetta 2: O Rosetta 2 é geralmente instalado automaticamente quando você tenta executar uma aplicação x86 pela primeira vez. Você pode verificar se o Rosetta 2 está instalado executando o comando softwareupdate --install-rosetta no terminal.
  2. Habilite o Rosetta 2: Certifique-se de que o Rosetta 2 esteja habilitado e funcionando corretamente. Você pode verificar isso executando um comando x86 nativo, como uname -m, que deve retornar “x86_64” mesmo em um host macOS ARM.
  3. Construa a imagem Docker amd64: Com o Rosetta 2 habilitado, você deve ser capaz de construir a imagem Docker amd64 sem problemas. Use o comando docker build para construir a imagem, especificando a arquitetura desejada com a opção --platform.
docker build --platform linux/amd64 -t meu-container-php .

Execute o Container amd64: Agora você pode executar o Container amd64 em seu host macOS ARM sem problemas, pois o Rosetta 2 irá emular a arquitetura x86_64 (amd64) no seu sistema.

docker run -it meu-container-php

O Rosetta 2 é uma solução elegante e transparente para lidar com a incompatibilidade de arquitetura entre imagens Docker e hosts macOS ARM. Ele permite que você execute aplicativos e Container amd64 em sistemas ARM sem precisar fazer alterações no código ou na imagem.

Solução2: Buildando a Imagem a Partir de uma Estação Linux

Preparação do Ambiente Linux

Para evitar o erro the requested image platform linux amd64 does not match, é recomendável usar uma estação Linux para buildar a imagem PHP. Linux possui um suporte mais robusto para diferentes arquiteturas, facilitando a compatibilidade.

  1. Configuração Inicial:
  • Configure uma máquina com Linux (Ubuntu é uma ótima opção) em uma máquina virtual ou em hardware dedicado.
  • Assegure-se de que o Docker esteja instalado e operando corretamente. Você pode consultar a documentação oficial do Docker para realizar a configuração.
  1. Verificação das Configurações do Docker:
  • Execute docker --version para garantir que você tem a versão correta instalada.
  • Configure o Docker para suportar múltiplas plataformas adicionando a linha {"experimental": true} no arquivo /etc/docker/daemon.json.

Buildando a Imagem PHP

Com o ambiente Linux configurado, você pode proceder com o build da imagem PHP.

  1. Criar um Dockerfile:
  • Crie um arquivo Dockerfile com o seguinte conteúdo:
FROM php:7.4-cli
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "php", "./seu-script.php" ]
  • Esse Dockerfile básico irá copiar seu código PHP para a imagem e configurar o ponto de entrada.
  1. Build da Imagem:
  • No terminal, navegue até o diretório onde seu Dockerfile está localizado.
  • Execute o comando:
    sh docker build -t my-php-app .
  1. Verificação da Imagem:
  • Após o Build, verifique se a imagem foi criada corretamente executando:
    sh docker images

Testando a Imagem

Para garantir que a imagem buildada funcione corretamente, execute um Container a partir dela:

  1. Executando o Container:
  • Execute o comando:
    sh docker run -it --rm my-php-app
  • Esse comando iniciará um Container interativo e removerá o Container após a execução.
  1. Verificando o Funcionamento:
  • Certifique-se de que seu script PHP está funcionando conforme o esperado. Qualquer erro ou mensagem será exibido no terminal.

Conclusão

O erro “WARNING: The requested image’s platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform” é um obstáculo comum ao buildar imagens Docker em MacOS, especialmente com os novos chips Apple Silicon. No entanto, ao utilizar o Rosetta 2 ou uma estação Linux para buildar suas imagens, você pode evitar essa incompatibilidade e garantir que suas aplicações funcionem corretamente.

Essa abordagem não só resolve o problema imediato, mas também prepara seu ambiente de desenvolvimento para futuras compilações e builds de Containers, garantindo uma maior compatibilidade e eficiência.

Quer aprender mais?

Se você encontrou este artigo útil, não deixe de conferir nossos outros conteúdos sobre Docker e desenvolvimento em PHP. Mantenha-se atualizado com as melhores práticas e dicas para otimizar seu fluxo de trabalho de desenvolvimento.

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: 39

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

Um comentário

Deixe um comentário

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