DEV Community

Cover image for Dominando o Docker Bake: Simplificando Builds Complexos
Rafael Pazini
Rafael Pazini

Posted on

1

Dominando o Docker Bake: Simplificando Builds Complexos

Com o aumento da complexidade nas aplicações modernas, especialmente em ambientes que utilizam monorepos ou múltiplos contêineres, o gerenciamento de builds no Docker pode rapidamente se tornar uma tarefa desafiadora. Felizmente, o Docker Bake surgiu como uma solução poderosa para simplificar, otimizar e acelerar esses processos. Neste post, vamos explorar o que é o Docker Bake, como utilizá-lo de forma eficaz, e alguns exemplos práticos que vão desde configurações básicas até recursos avançados.


O que é o Docker Bake?

O Docker Bake é uma ferramenta que permite definir e executar builds de imagens Docker de forma declarativa e eficiente. Ele é especialmente útil para cenários onde você precisa construir múltiplas imagens simultaneamente, compartilhar configurações entre diferentes ambientes ou simplificar comandos de build complexos.

Vantagens do Docker Bake:

  1. Simplicidade: Abstrai configurações complexas em um comando simples.
  2. Flexibilidade: Suporte para funções customizadas, matrices, e muito mais.
  3. Consistência: Compartilhamento fácil de configurações com o time.
  4. Performance: Builds paralelos para acelerar workflows.

Como Funciona o Docker Bake?

O Docker Bake usa arquivos de configuração em formato HCL (docker-bake.hcl) ou JSON (docker-bake.json) para definir targets, variáveis, e estratégias de caching. É como se fosse um "Makefile" para imagens Docker, mas com muito mais poder e simplicidade.

Estrutura Básica de um Arquivo docker-bake.hcl

variable "TAG" {
  default = "latest"
}

target "app" {
  context = "."
  dockerfile = "Dockerfile"
  tags = ["meuapp:${TAG}"]
}

target "app-prod" {
  inherits = ["app"]
  args = {
    ENV = "production"
  }
  tags = ["meuapp:prod"]
}
Enter fullscreen mode Exit fullscreen mode

Com esse arquivo, você pode rodar:

docker buildx bake app-prod
Enter fullscreen mode Exit fullscreen mode

Isso constrói a imagem com o tag meuapp:prod e a variável de ambiente ENV=production.


Recursos Avançados do Docker Bake

1. Matrix de Targets

Se você precisa construir a mesma imagem para diferentes arquiteturas ou ambientes, o Docker Bake permite definir matrices para automatizar esse processo.

variable "PLATFORMS" {
  default = ["linux/amd64", "linux/arm64"]
}

target "multiarch-app" {
  context = "."
  dockerfile = "Dockerfile"
  platforms = PLATFORMS
  tags = ["meuapp:multiarch"]
}
Enter fullscreen mode Exit fullscreen mode

Agora, com um único comando, você cria imagens para múltiplas arquiteturas:

docker buildx bake multiarch-app
Enter fullscreen mode Exit fullscreen mode

2. Entitlements (Permissões Especiais)

Com o Bake, você pode controlar permissões especiais usando o flag --allow. Isso é útil para builds que precisam de acesso a recursos como o sistema de arquivos host ou rede.

docker buildx bake app-prod --allow network.host --allow fs.read=/dados/externos
Enter fullscreen mode Exit fullscreen mode

Essa abordagem melhora a segurança, garantindo que apenas as permissões necessárias sejam concedidas.

3. Deduplicacão de Contextos

Se você está construindo várias imagens que compartilham o mesmo contexto, o Bake agora deduplica automaticamente essas transferências, acelerando significativamente o tempo de build.

Antes, era necessário definir contextos nomeados manualmente:

group "apps" {
  targets = ["app1", "app2"]
}

target "app1" {
  context = "."
  dockerfile = "Dockerfile.app1"
}

target "app2" {
  context = "."
  dockerfile = "Dockerfile.app2"
}
Enter fullscreen mode Exit fullscreen mode

Agora, o Bake otimiza isso automaticamente sem necessidade de ajustes adicionais.

4. Validação de Variáveis

Assim como no Terraform, o Docker Bake agora permite validar variáveis para garantir que os valores fornecidos sejam adequados.

variable "VERSION" {
  validation {
    condition = VERSION != ""
    error_message = "A variável VERSION é obrigatória."
  }
  validation {
    condition = strlen(VERSION) > 3
    error_message = "A VERSION deve ter mais de 3 caracteres."
  }
}
Enter fullscreen mode Exit fullscreen mode

Se a variável VERSION não for definida ou for muito curta, o Bake retornará um erro descritivo.

5. Atributos Componíveis

A partir da versão GA do Bake, atributos como cache-from, output, e secret podem ser definidos como objetos estruturados, facilitando a reutilização e composição.

target "app" {
  cache-from = [
    { type = "registry", ref = "usuario/app:cache" },
    { type = "local", src = "./cache" }
  ]

  output = [
    { type = "local", dest = "./build" },
    { type = "oci", dest = "./app.oci" }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Casos de Uso Reais

1. Monorepos

Se você trabalha com um monorepo contendo diversos serviços, o Docker Bake facilita a construção de todos os serviços de forma paralela e otimizada.

group "servicos" {
  targets = ["api", "frontend", "worker"]
}

target "api" {
  context = "./api"
  dockerfile = "Dockerfile"
}

target "frontend" {
  context = "./frontend"
  dockerfile = "Dockerfile"
}

target "worker" {
  context = "./worker"
  dockerfile = "Dockerfile"
}
Enter fullscreen mode Exit fullscreen mode

Rodando:

docker buildx bake servicos
Enter fullscreen mode Exit fullscreen mode

2. Microservices Distribuídos

Mesmo que você não utilize um monorepo, é possível gerenciar builds de múltiplos microserviços que residem em diferentes repositórios ou diretórios.

target "auth-service" {
  context = "../auth-service"
  dockerfile = "Dockerfile"
  tags = ["empresa/auth:latest"]
}

target "payment-service" {
  context = "../payment-service"
  dockerfile = "Dockerfile"
  tags = ["empresa/payment:latest"]
}

group "microservices" {
  targets = ["auth-service", "payment-service"]
}
Enter fullscreen mode Exit fullscreen mode

Com isso, você pode construir todos os microserviços com um único comando:

docker buildx bake microservices
Enter fullscreen mode Exit fullscreen mode

3. Execução de Testes Automatizados

O Docker Bake também é útil para pipelines de CI/CD, facilitando a execução de testes automatizados.

target "test" {
  context = "."
  dockerfile = "Dockerfile.test"
  args = {
    TEST_ENV = "ci"
  }
  output = ["type=local,dest=./test-results"]
}
Enter fullscreen mode Exit fullscreen mode

Rodando o comando abaixo, você dispara o ambiente de testes:

docker buildx bake test
Enter fullscreen mode Exit fullscreen mode

Isso permite a integração fácil com ferramentas de CI como GitHub Actions ou GitLab CI.

4. Integração com Docker Compose

Você também pode usar o Bake junto com o Docker Compose:

docker buildx bake --file docker-compose.yml
Enter fullscreen mode Exit fullscreen mode

Isso permite reaproveitar suas configurações de services do Compose para gerenciar builds.


Conclusão

O Docker Bake é uma ferramenta essencial para quem busca simplificar e otimizar workflows de build no Docker. Com recursos como matrices de targets, deduplicacção de contextos, permissões configuráveis e validação de variáveis, ele oferece um ambiente robusto para desenvolvedores e times de DevOps.

Se você ainda está lutando com comandos complexos e builds lentos, é hora de dar uma chance ao Docker Bake e transformar sua experiência de desenvolvimento.


Recursos Adicionais

Experimente e compartilhe suas experiências nos comentários!

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs