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 :
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
:
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 :
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 :
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 :
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
.
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
:
target "foo" {
dockerfile = "foo.Dockerfile"
tags = ["myapp:latest"]
}
target "bar" {
dockerfile = "bar.Dockerfile"
tags = target.foo.tags
}