Oxcart Baixar
Menu

Execute e teste contêineres do Google Cloud Run localmente no Mac

Para testar um serviço do Cloud Run em um Mac com Apple silicon, compile para linux/amd64 e execute com a variável PORT: docker run -e PORT=8080 -p 8080:8080 IMAGE. No Oxcart, tanto nosso serviço quanto o exemplo do Cloud Run do Google rodaram assim, com as imagens amd64 via Rosetta, para você testar exatamente a imagem que vai implantar.

Atualizado

Os requisitos de execução de contêineres do Cloud Run

O Cloud Run executa qualquer contêiner que siga alguns requisitos. A documentação do Google diz que as solicitações vão para a porta 8080 por padrão, a variável de ambiente PORT é definida no contêiner de entrada, e o contêiner “deve escutar solicitações em 0.0.0.0” e “não deve escutar em 127.0.0.1”. Também diz que o Cloud Run “aceita especificamente o formato ABI Linux x86_64” e que uma imagem com várias arquiteturas deve incluir linux/amd64.

Duas dessas regras costumam causar problemas para quem desenvolve no Mac: um app vinculado a localhost funciona no terminal local e falha no Cloud Run, e uma imagem compilada nativamente no Apple silicon é arm64. Testar o contêiner real localmente detecta os dois problemas antes da implantação.

Teste um serviço do Cloud Run localmente no Apple silicon

  1. Escute em $PORT e 0.0.0.0. Faça o servidor ler a variável de ambiente PORT (o Cloud Run envia solicitações para 8080 por padrão) e vincular-se a 0.0.0.0, não a 127.0.0.1.
  2. Compile para linux/amd64. Execute docker buildx build --platform linux/amd64 --load -t my-service .. O Cloud Run aceita a ABI Linux x86_64, então uma imagem arm64 compilada nativamente no seu Mac tem a arquitetura de destino errada.
  3. Execute como o Cloud Run faria. Execute docker run --rm --platform linux/amd64 -e PORT=8080 -p 8080:8080 my-service. O Oxcart executa a imagem amd64 via Rosetta.
  4. Faça uma chamada. Execute curl localhost:8080. Para verificar o tratamento de PORT, inicie uma segunda cópia com -e PORT=9090 -p 9090:9090.
  5. Publique no Artifact Registry. Execute gcloud auth configure-docker REGION-docker.pkg.dev uma vez, marque a imagem com a tag REGION-docker.pkg.dev/PROJECT/REPO/my-service:TAG e envie com docker push.

O que executamos no Oxcart

Um pequeno serviço Python vinculado a $PORT, executado duas vezes com portas diferentes, além da imagem de exemplo do próprio Google:

docker run -d -e PORT=8080 -p 18081:8080 my-service
docker run -d -e PORT=9090 -p 18090:9090 my-service
curl localhost:18081        # hello from PORT=8080
curl localhost:18090        # hello from PORT=9090

docker run -d -e PORT=8080 -p 8081:8080 us-docker.pkg.dev/cloudrun/container/hello
docker image inspect us-docker.pkg.dev/cloudrun/container/hello --format '{{.Os}}/{{.Architecture}}'
# linux/amd64
curl localhost:8081         # "It's running!"

O exemplo do Google é uma imagem somente amd64; o Oxcart a baixou e executou via Rosetta sem opções extras. Para imagens somente amd64 que você compilar, passe --platform linux/amd64 também no docker run: nos nossos testes, uma imagem amd64 compilada localmente só foi encontrada quando a plataforma foi informada.

Compilar para linux/amd64 no Apple silicon

# Cloud Run target: amd64
docker buildx build --platform linux/amd64 --load -t my-service:amd64 .

# Both architectures in the local image store (runs locally either way)
docker buildx build --platform linux/amd64,linux/arm64 -t my-service:multi .

O builder padrão do Oxcart lista linux/amd64 e linux/arm64, e a compilação multiplataforma termina localmente com as duas variantes executáveis. O envio de uma imagem multiplataforma pelo Oxcart não é suportado; para o Cloud Run, publique a tag amd64, que é a variante que ele executa. As compilações são rápidas: 341 ms sem cache e 121 ms com cache para um contexto local pequeno, o mais rápido dos três ambientes testados.

Publique no Artifact Registry e implante

gcloud auth configure-docker us-central1-docker.pkg.dev
docker tag my-service:amd64 us-central1-docker.pkg.dev/my-project/apps/my-service:1.0.0
docker push us-central1-docker.pkg.dev/my-project/apps/my-service:1.0.0
gcloud run deploy my-service \
  --image us-central1-docker.pkg.dev/my-project/apps/my-service:1.0.0 --region us-central1

Dependências com Compose

Um serviço do Cloud Run geralmente se comunica com um banco de dados, cache ou outro serviço. Execute-os ao lado dele com Compose, defina PORT no ambiente do serviço e condicione a ordem de inicialização aos healthchecks:

services:
  api:
    build: .
    platform: linux/amd64
    environment:
      PORT: "8080"
      REDIS_URL: redis://cache:6379
    ports: ["8080:8080"]
    depends_on:
      cache:
        condition: service_healthy
  cache:
    image: redis:7-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 2s
      retries: 30

docker compose up -d --wait retorna quando o cache está saudável e a API iniciou. O guia do Compose no Apple silicon detalha healthchecks, imagens amd64 e portas.

Portas no seu Mac

As portas publicadas escutam em todas as interfaces do Mac, como no padrão do Docker. Se outro app do Mac já escuta em 127.0.0.1:8080, localhost:8080 pode alcançar esse app em vez do seu contêiner. Escolha uma porta livre no host (-p 18080:8080) e mantenha PORT como o Cloud Run define. A visualização Ports do Oxcart mostra todos os serviços escutando no Mac ao lado dos seus contêineres e explica por que uma porta de contêiner não responde, inclusive quando o servidor está vinculado a 127.0.0.1 dentro do contêiner, o mesmo erro rejeitado pelo Cloud Run. Veja redes de contêineres no Mac.

Perguntas

Como executo um serviço do Cloud Run localmente no Mac?

Execute o contêiner com a variável PORT definida e a porta publicada: docker run -e PORT=8080 -p 8080:8080 IMAGE. Esse é o método que o Google documenta para testes locais com Docker. No Oxcart, verificamos com nossa imagem nas portas 8080 e 9090 e com o exemplo do Google us-docker.pkg.dev/cloudrun/container/hello.

Por que a implantação no Cloud Run falha com uma imagem compilada no Apple silicon?

O Google documenta que o Cloud Run aceita a ABI Linux x86_64 e que uma imagem com várias arquiteturas deve incluir linux/amd64. Um simples docker build em um Mac com Apple silicon produz uma imagem arm64. Compile com --platform linux/amd64.

Posso executar a imagem amd64 no Mac antes de implantar?

Sim. O Oxcart executa imagens linux/amd64 via Rosetta. Passe --platform linux/amd64 ao executar uma imagem somente amd64 compilada localmente; as imagens amd64 baixadas, como o exemplo hello do Google, rodaram sem essa opção no nosso teste.

Meu contêiner funciona localmente, mas o Cloud Run diz que ele não conseguiu escutar na porta. Por quê?

A causa mais comum é vincular-se a 127.0.0.1 ou a uma porta fixa no código. Os requisitos do Cloud Run dizem que o contêiner deve escutar em 0.0.0.0 na porta indicada por PORT. Teste localmente com um PORT diferente do padrão (por exemplo, 9090) para detectar portas fixas no código.

Preciso de gcloud beta code dev ou Cloud Code?

Não, são opcionais. O Google lista Docker simples, Docker com acesso ao Google Cloud, o emulador Cloud Code e gcloud beta code dev como formas de testar localmente. Docker no Oxcart permite testar diretamente a imagem e seu tratamento de PORT. gcloud beta code dev adiciona um fluxo de desenvolvimento baseado em Kubernetes usando minikube ou um contexto Kubernetes existente; escolha essa opção quando precisar dessa integração.

Como dou ao contêiner local acesso às APIs do Google Cloud?

Monte as credenciais como o Google documenta para “Docker com acesso ao Google Cloud”, normalmente Application Default Credentials por meio de um arquivo montado e GOOGLE_APPLICATION_CREDENTIALS. As conexões de saída dos contêineres no Oxcart são abertas pelo seu Mac, então sua VPN e seu DNS se aplicam.

Fontes e método

  • Exemplos testados com Oxcart 0.1.2, Mac17,14, macOS 27.2, 2026-10-10 (PORT em 8080 e 9090, exemplo hello do Google como linux/amd64, compilações Buildx para uma e várias plataformas).
  • Requisitos de contêineres do Cloud Run (porta, 0.0.0.0, x86_64): https://docs.cloud.google.com/run/docs/container-contract. Opções de teste local: https://docs.cloud.google.com/run/docs/testing/local e https://docs.cloud.google.com/sdk/gcloud/reference/beta/code/dev. Verificado em 2026-10-10.
  • Velocidade de compilação: Oxcart 0.1.2, 2026-10-10, Apple M5 Max, 8 CPUs e 12 GiB, medianas de cinco amostras; os demais ambientes foram medidos mais cedo no mesmo dia, no mesmo Mac e com o mesmo sistema de medição, usando o cliente docker 29.4.

Experimente Oxcart nos seus projetos

Grátis por 60 dias. Depois, $20 por usuário, por versão principal: sem assinatura.

Apple silicon · macOS 26 ou posterior

Leia a seguir

Notas da versão

Oxcart 0.1.4

Versão mais recente

Licenciamento e melhorias.

  • Ativação da licença por link seguro enviado por e-mail.
  • Gerenciamento de licenças e Macs a partir de Settings.
  • Verificação de licenças offline.
  • Melhorias de desempenho, ajustes na interface e correções de bugs.

Requer macOS 26.0 ou posterior

Oxcart 0.1.3

Liberação de memória durante a inatividade.

  • Libera a memória da VM quando nenhum contêiner está em execução.
  • Preserva contêineres, imagens, volumes e redes.

Requer macOS 26.0 ou posterior

Oxcart 0.1.2

Integração de ferramentas de linha de comando.

  • Alterne entre as ferramentas Docker incluídas no Oxcart e uma instalação existente.
  • Ajustes na interface.

Requer macOS 26.0 ou posterior

Oxcart 0.1.1

Ferramentas Docker incluídas e controles para agentes.

  • Docker CLI 29.9, Compose 5.6 e Buildx 0.38 incluídos.
  • Integração com contextos Docker e credenciais protegidas no Acesso às Chaves.
  • Conexões de agentes via MCP com permissões e bloqueio por agente.

Requer macOS 26.0 ou posterior

Oxcart 0.1.0

Contêineres compatíveis com Docker para Apple silicon.

  • Compatibilidade com Docker CLI, Compose e Buildx.
  • Configuração offline com os componentes de execução incluídos.
  • Portas organizadas por projeto e branch do Git.
  • Integração MCP com acesso somente leitura por padrão.
  • Atualizações automáticas verificadas.

Requer macOS 26.0 ou posterior