Compartir comentarios
Las respuestas se generan en base a la documentación.

Herencia en Bake

Los objetivos (targets) pueden heredar atributos de otros objetivos mediante el atributo inherits. Por ejemplo, imagina que tienes un objetivo que compila una imagen de Docker para un entorno de desarrollo:

docker-bake.hcl
target "app-dev" {
  args = {
    GO_VERSION = "1.25"
  }
  tags = ["docker.io/username/myapp:dev"]
  labels = {
    "org.opencontainers.image.source" = "https://github.com/username/myapp"
    "org.opencontainers.image.author" = "[email protected]"
  }
}

Puedes crear un nuevo objetivo que use la misma configuración de compilación, pero con atributos ligeramente diferentes para una compilación de producción. En este ejemplo, el objetivo app-release hereda del objetivo app-dev, pero sobrescribe el atributo tags y añade un nuevo atributo platforms:

docker-bake.hcl
target "app-release" {
  inherits = ["app-dev"]
  tags = ["docker.io/username/myapp:latest"]
  platforms = ["linux/amd64", "linux/arm64"]
}

Objetivos comunes reutilizables

Un patrón de herencia común consiste en definir un objetivo base o común que contenga atributos compartidos por todos o por muchos de los objetivos de compilación del proyecto. Por ejemplo, el siguiente objetivo _common define un conjunto común de argumentos de compilación:

docker-bake.hcl
target "_common" {
  args = {
    GO_VERSION = "1.25"
    BUILDKIT_CONTEXT_KEEP_GIT_DIR = 1
  }
}

Luego puedes heredar del objetivo _common en otros objetivos para aplicar los atributos compartidos:

docker-bake.hcl
target "lint" {
  inherits = ["_common"]
  dockerfile = "./dockerfiles/lint.Dockerfile"
  output = [{ type = "cacheonly" }]
}

target "docs" {
  inherits = ["_common"]
  dockerfile = "./dockerfiles/docs.Dockerfile"
  output = ["./docs/reference"]
}

target "test" {
  inherits = ["_common"]
  target = "test-output"
  output = ["./test"]
}

target "binaries" {
  inherits = ["_common"]
  target = "binaries"
  output = ["./build"]
  platforms = ["local"]
}

Sobrescribir atributos heredados

Cuando un objetivo hereda de otro, puede sobrescribir cualquiera de los atributos heredados. Por ejemplo, el siguiente objetivo sobrescribe el atributo args del objetivo heredado:

docker-bake.hcl
target "app-dev" {
  inherits = ["_common"]
  args = {
    GO_VERSION = "1.17"
  }
  tags = ["docker.io/username/myapp:dev"]
}

El argumento GO_VERSION en app-dev se establece en 1.17, sobrescribiendo el argumento GO_VERSION del objetivo _common.

Para obtener más información sobre cómo sobrescribir atributos, consulta la página Sobrescribir configuraciones.

Heredar de múltiples objetivos

El atributo inherits es una lista, lo que significa que puedes reutilizar atributos de múltiples objetivos. En el siguiente ejemplo, el objetivo app-release reutiliza atributos tanto del objetivo app-dev como del objetivo _common.

docker-bake.hcl
target "_common" {
  args = {
    GO_VERSION = "1.25"
    BUILDKIT_CONTEXT_KEEP_GIT_DIR = 1
  }
}

target "app-dev" {
  inherits = ["_common"]
  args = {
    BUILDKIT_CONTEXT_KEEP_GIT_DIR = 0
  }
  tags = ["docker.io/username/myapp:dev"]
  labels = {
    "org.opencontainers.image.source" = "https://github.com/username/myapp"
    "org.opencontainers.image.author" = "[email protected]"
  }
}

target "app-release" {
  inherits = ["app-dev", "_common"]
  tags = ["docker.io/username/myapp:latest"]
  platforms = ["linux/amd64", "linux/arm64"]
}

Cuando se heredan atributos de múltiples objetivos y hay un conflicto, el objetivo que aparece al final de la lista inherits tiene prioridad. El ejemplo anterior define BUILDKIT_CONTEXT_KEEP_GIT_DIR en el objetivo _common y lo sobrescribe en el objetivo app-dev.

El objetivo app-release hereda tanto de app-dev como de _common. El argumento BUILDKIT_CONTEXT_KEEP_GIT_DIR se establece en 0 en app-dev y en 1 en _common. El argumento BUILDKIT_CONTEXT_KEEP_GIT_DIR en el objetivo app-release se establece en 1, no en 0, debido a que el objetivo _common aparece en último lugar en la lista de herencia.

Reutilizar atributos individuales de objetivos

Si solo deseas heredar un único atributo de un objetivo, puedes hacer referencia a un atributo de otro objetivo mediante la notación de punto. Por ejemplo, en el siguiente archivo de Bake, el objetivo bar reutiliza el atributo tags del objetivo foo:

docker-bake.hcl
target "foo" {
  dockerfile = "foo.Dockerfile"
  tags       = ["myapp:latest"]
}
target "bar" {
  dockerfile = "bar.Dockerfile"
  tags       = target.foo.tags
}