DevOps Mind
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.
Índice
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”:
- 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. - 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. - 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.
- 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.
- 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.
- 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.
- 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 .
- 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:
- 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.
- 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.
Estava com esse erro aqui, a solução 1 me ajudou bastante!!
Top demais!