Pular para o conteúdo principal

🐳 Guia de Build Docker - SGApi

Build para AMD64 (x86_64) - Padrão

docker build -t sgapi:latest .

Build para ARM64

Opção 1: Usar Dockerfile.arm64 (Recomendado)

docker buildx build --platform linux/arm64 -f Dockerfile.arm64 -t sgapi:arm64 --load .

Opção 2: Usar Dockerfile padrão com buildx

# Criar builder com suporte multi-platform (se ainda não criou)
docker buildx create --name multiplatform --use

# Build para ARM64
docker buildx build --platform linux/arm64 -t sgapi:arm64 --load .

Opção 3: Build multi-platform (AMD64 + ARM64)

docker buildx build --platform linux/amd64,linux/arm64 -t sgapi:latest --push .

Solução de Problemas

Erro: System.AccessViolationException durante dotnet restore (ARM64)

Este erro era comum em builds cross-platform via QEMU devido a problemas conhecidos do .NET SDK 10.0.

✅ Solução Implementada:

O Dockerfile.arm64 foi otimizado para fazer o build completo em AMD64 (evitando problemas de QEMU) e depois copiar os binários compilados para ARM64 via cross-compilation do .NET. Esta abordagem:

  • ✅ Evita problemas de SSL/TLS em QEMU
  • ✅ Evita AccessViolationException e NullReferenceException do MSBuild
  • ✅ Usa cross-compilation nativa do .NET SDK
  • ✅ Produz binários corretos para ARM64

Comando para build ARM64:

docker buildx build --platform linux/arm64 -f Dockerfile.arm64 -t sgapi:arm64 --load .

Outras opções (se necessário):

  1. Usar script PowerShell:

    .\build-arm64.ps1
  2. Aumentar recursos do Docker Desktop (pode ajudar com performance):

    • Settings → Resources → Advanced
    • CPU: Mínimo 4 cores
    • Memory: Mínimo 8GB (recomendado 16GB)
    • Disk: Mínimo 60GB livre
  3. Usar build nativo em máquina ARM64 (melhor performance):

    # Em máquina ARM64 nativa (Mac M1/M2, Raspberry Pi 4+, etc)
    docker build -f Dockerfile.arm64 -t sgapi:arm64 .

Build muito lento (ARM64)

Builds cross-platform são naturalmente mais lentos devido à emulação. Para acelerar:

  1. Use --load apenas quando necessário (não use em CI/CD)
  2. Use cache de layers: docker buildx build --cache-from type=local,src=/tmp/.buildx-cache
  3. Considere usar runners ARM64 nativos em CI/CD

Variáveis de Ambiente no Build

Você pode passar variáveis de ambiente durante o build:

docker build \
--build-arg BUILDPLATFORM=linux/amd64 \
-t sgapi:latest .

Executar Container

AMD64

docker run -d --name sgapi -p 8080:8080 sgapi:latest --cloud

ARM64

docker run -d --name sgapi -p 8080:8080 sgapi:arm64 --cloud

Verificar Arquitetura da Imagem

docker inspect sgapi:latest | grep Architecture

Notas

  • O Dockerfile.arm64 é otimizado especificamente para builds ARM64
  • Builds cross-platform podem levar 3-5x mais tempo que builds nativos
  • Para produção, considere usar runners nativos da arquitetura alvo