⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Héritage dans Bake

Les cibles peuvent hériter des attributs d'autres cibles, en utilisant l'attribut inherits. Par exemple, imaginez que vous avez une cible qui construit une image Docker pour un environnement de développement :

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

Vous pouvez créer une nouvelle cible qui utilise la même configuration de build, mais avec des attributs légèrement différents pour une construction de production. Dans cet exemple, la cible app-release hérite de la cible app-dev, mais surcharge l'attribut tags et ajoute un nouvel attribut platforms :

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

Cibles réutilisables communes

Un modèle d'héritage courant consiste à définir une cible commune qui contient des attributs partagés pour toutes ou plusieurs des cibles de build du projet. Par exemple, la cible _common suivante définit un ensemble commun d'arguments de build :

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

Vous pouvez ensuite hériter de la cible _common dans d'autres cibles pour appliquer les attributs partagés :

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"]
}

Surcharger les attributs hérités

Lorsqu'une cible hérite d'une autre cible, elle peut surcharger n'importe lequel des attributs hérités. Par exemple, la cible suivante surcharge l'attribut args de la cible héritée :

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

L'argument GO_VERSION dans app-release est défini sur 1.17, surchargeant l'argument GO_VERSION de la cible app-dev.

Pour plus d'informations sur la surcharge des attributs, consultez la page Surcharger les configurations.

Hériter de plusieurs cibles

L'attribut inherits est une liste, ce qui signifie que vous pouvez réutiliser les attributs de plusieurs autres cibles. Dans l'exemple suivant, la cible app-release réutilise les attributs des cibles app-dev et _common.

docker-bake.hcl
target "_common" {
  args = {
    GO_VERSION = "1.24"
    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"]
}

Lors de l'héritage d'attributs de plusieurs cibles et en cas de conflit, la cible qui apparaît en dernier dans la liste d'héritage a la priorité. L'exemple précédent définit le BUILDKIT_CONTEXT_KEEP_GIT_DIR dans la cible _common et le surcharge dans la cible app-dev.

La cible app-release hérite à la fois de la cible app-dev et de la cible _common. L'argument BUILDKIT_CONTEXT_KEEP_GIT_DIR est défini sur 0 dans la cible app-dev et sur 1 dans la cible _common. L'argument BUILDKIT_CONTEXT_KEEP_GIT_DIR dans la cible app-release est défini sur 1, et non sur 0, car la cible _common apparaît en dernier dans la liste d'héritage.

Réutiliser des attributs uniques de cibles

Si vous ne souhaitez hériter que d'un seul attribut d'une cible, vous pouvez référencer un attribut d'une autre cible en utilisant la notation par points. Par exemple, dans le fichier Bake suivant, la cible bar réutilise l'attribut tags de la cible foo :

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