Surcharger les configurations
Bake prend en charge le chargement des définitions de build à partir de fichiers, mais parfois vous avez besoin d'encore plus de flexibilité pour configurer ces définitions. Par exemple, vous pourriez vouloir surcharger un attribut lors de la construction dans un environnement particulier ou pour une cible spécifique.
La liste suivante d'attributs peut être surchargée :
args
attest
cache-from
cache-to
context
contexts
dockerfile
entitlements
labels
network
no-cache
output
platform
pull
secrets
ssh
tags
target
Pour surcharger ces attributs, vous pouvez utiliser les méthodes suivantes :
Surcharges de fichiers
Vous pouvez charger plusieurs fichiers Bake qui définissent des configurations de build pour vos cibles. C'est utile lorsque vous souhaitez séparer les configurations dans différents fichiers pour une meilleure organisation, ou pour surcharger conditionnellement les configurations en fonction des fichiers chargés.
Recherche de fichiers par défaut
Vous pouvez utiliser l'indicateur --file
ou -f
pour spécifier les fichiers à charger.
Si vous ne spécifiez aucun fichier, Bake utilisera l'ordre de recherche suivant :
compose.yaml
compose.yml
docker-compose.yml
docker-compose.yaml
docker-bake.json
docker-bake.hcl
docker-bake.override.json
docker-bake.override.hcl
Si plus d'un fichier Bake est trouvé, tous les fichiers sont chargés et fusionnés en une seule définition. Les fichiers sont fusionnés selon l'ordre de recherche.
$ docker buildx bake --print
[+] Building 0.0s (1/1) FINISHED
=> [internal] load local bake definitions 0.0s
=> => reading compose.yaml 45B / 45B 0.0s
=> => reading docker-bake.hcl 113B / 113B 0.0s
=> => reading docker-bake.override.hcl 65B / 65B
Si les fichiers fusionnés contiennent des définitions d'attributs en double, ces définitions sont soit fusionnées, soit surchargées par la dernière occurrence, en fonction de l'attribut.
Bake tentera de charger tous les fichiers dans l'ordre où ils sont trouvés. Si plusieurs fichiers définissent la même cible, les attributs sont soit fusionnés, soit surchargés. Dans le cas de surcharges, la dernière chargée prévaut.
Par exemple, étant donné les fichiers suivants :
variable "TAG" {
default = "foo"
}
target "default" {
tags = ["username/my-app:${TAG}"]
}
variable "TAG" {
default = "bar"
}
Puisque docker-bake.override.hcl
est chargé en dernier dans l'ordre de recherche par défaut,
la variable TAG
est surchargée avec la valeur bar
.
$ docker buildx bake --print
{
"target": {
"default": {
"context": ".",
"dockerfile": "Dockerfile",
"tags": ["username/my-app:bar"]
}
}
}
Surcharges de fichiers manuelles
Vous pouvez utiliser l'indicateur --file
pour spécifier explicitement quels fichiers charger,
et l'utiliser comme un moyen d'appliquer conditionnellement des fichiers de surcharge.
Par exemple, vous pouvez créer un fichier qui définit un ensemble de configurations pour un
environnement spécifique, et le charger uniquement lors de la construction pour cet environnement. L'exemple
suivant montre comment charger un fichier override.hcl
qui définit la
variable TAG
sur bar
. La variable TAG
est ensuite utilisée dans la cible default
.
variable "TAG" {
default = "foo"
}
target "default" {
tags = ["username/my-app:${TAG}"]
}
variable "TAG" {
default = "bar"
}
L'impression de la configuration de build sans l'indicateur --file
montre que la variable TAG
est définie sur la valeur par défaut foo
.
$ docker buildx bake --print
{
"target": {
"default": {
"context": ".",
"dockerfile": "Dockerfile",
"tags": [
"username/my-app:foo"
]
}
}
}
L'utilisation de l'indicateur --file
pour charger le fichier overrides.hcl
surcharge la variable TAG
avec la valeur bar
.
$ docker buildx bake -f docker-bake.hcl -f overrides.hcl --print
{
"target": {
"default": {
"context": ".",
"dockerfile": "Dockerfile",
"tags": [
"username/my-app:bar"
]
}
}
}
Ligne de commande
Vous pouvez également surcharger les configurations de cible depuis la ligne de commande avec
l'indicateur
--set
:
# docker-bake.hcl
target "app" {
args = {
mybuildarg = "foo"
}
}
$ docker buildx bake --set app.args.mybuildarg=bar --set app.platform=linux/arm64 app --print
{
"group": {
"default": {
"targets": ["app"]
}
},
"target": {
"app": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"mybuildarg": "bar"
},
"platforms": ["linux/arm64"]
}
}
}
La syntaxe de correspondance de motifs définie dans https://golang.org/pkg/path/#Match est également prise en charge :
$ docker buildx bake --set foo*.args.mybuildarg=value # surcharge l'argument de build pour toutes les cibles commençant par "foo"
$ docker buildx bake --set *.platform=linux/arm64 # surcharge la plateforme pour toutes les cibles
$ docker buildx bake --set foo*.no-cache # contourne la mise en cache uniquement pour les cibles commençant par "foo"
La liste complète des attributs qui peuvent être surchargés avec --set
est :
args
attest
cache-from
cache-to
context
contexts
dockerfile
entitlements
labels
network
no-cache
output
platform
pull
secrets
ssh
tags
target
Variables d'environnement
Vous pouvez également utiliser des variables d'environnement pour surcharger les configurations.
Bake vous permet d'utiliser des variables d'environnement pour surcharger la valeur d'un
bloc variable
. Seuls les blocs variable
peuvent être surchargés avec des variables d'environnement.
Cela signifie que vous devez définir les variables dans le fichier bake, puis définir la
variable d'environnement avec le même nom pour la surcharger.
L'exemple suivant montre comment vous pouvez définir une variable TAG
avec une valeur par défaut
dans le fichier Bake, et la surcharger avec une variable d'environnement.
variable "TAG" {
default = "latest"
}
target "default" {
context = "."
dockerfile = "Dockerfile"
tags = ["docker.io/username/webapp:${TAG}"]
}
$ export TAG=$(git rev-parse --short HEAD)
$ docker buildx bake --print webapp
La variable TAG
est surchargée avec la valeur de la variable d'environnement,
qui est le hachage de commit court généré par git rev-parse --short HEAD
.
{
"group": {
"default": {
"targets": ["webapp"]
}
},
"target": {
"webapp": {
"context": ".",
"dockerfile": "Dockerfile",
"tags": ["docker.io/username/webapp:985e9e9"]
}
}
}
Coercition de type
La surcharge de variables non-chaînes avec des variables d'environnement est prise en charge. Les valeurs passées en tant que variables d'environnement sont d'abord converties en types appropriés.
L'exemple suivant définit une variable PORT
. La cible backend
utilise la
variable PORT
telle quelle, et la cible frontend
utilise la valeur de PORT
incrémentée de un.
variable "PORT" {
default = 3000
}
group "default" {
targets = ["backend", "frontend"]
}
target "backend" {
args = {
PORT = PORT
}
}
target "frontend" {
args = {
PORT = add(PORT, 1)
}
}
Surcharger PORT
en utilisant une variable d'environnement forcera d'abord la valeur
dans le type attendu, un entier, avant que l'expression dans la cible frontend
ne s'exécute.
$ PORT=7070 docker buildx bake --print
{
"group": {
"default": {
"targets": [
"backend",
"frontend"
]
}
},
"target": {
"backend": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"PORT": "7070"
}
},
"frontend": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"PORT": "7071"
}
}
}
}