DEV Community

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

Posted on

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!

Top comments (0)