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

Variables dans Bake

Vous pouvez définir et utiliser des variables dans un fichier Bake pour définir des valeurs d'attributs, les interpoler dans d'autres valeurs et effectuer des opérations arithmétiques. Les variables peuvent être définies avec des valeurs par défaut et peuvent être surchargées avec des variables d'environnement.

Utiliser des variables comme valeurs d'attributs

Utilisez le bloc variable pour définir une variable.

docker-bake.hcl
variable "TAG" {
  default = "docker.io/username/webapp:latest"
}

L'exemple suivant montre comment utiliser la variable TAG dans une cible.

docker-bake.hcl
target "webapp" {
  context = "."
  dockerfile = "Dockerfile"
  tags = [ TAG ]
}

Interpoler des variables dans des valeurs

Bake prend en charge l'interpolation de chaînes de variables dans des valeurs. Vous pouvez utiliser la syntaxe ${} pour interpoler une variable dans une valeur. L'exemple suivant définit une variable TAG avec la valeur latest.

docker-bake.hcl
variable "TAG" {
  default = "latest"
}

Pour interpoler la variable TAG dans la valeur d'un attribut, utilisez la syntaxe ${TAG}.

docker-bake.hcl
group "default" {
  targets = [ "webapp" ]
}

variable "TAG" {
  default = "latest"
}

target "webapp" {
  context = "."
  dockerfile = "Dockerfile"
  tags = ["docker.io/username/webapp:${TAG}"]
}

L'impression du fichier Bake avec l'indicateur --print affiche la valeur interpolée dans la configuration de build résolue.

$ docker buildx bake --print
{
  "group": {
    "default": {
      "targets": ["webapp"]
    }
  },
  "target": {
    "webapp": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "tags": ["docker.io/username/webapp:latest"]
    }
  }
}

Valider les variables

Pour vérifier que la valeur d'une variable est conforme à un type, une plage de valeurs ou une autre condition attendus, vous pouvez définir des règles de validation personnalisées à l'aide du bloc validation.

Dans l'exemple suivant, la validation est utilisée pour appliquer une contrainte numérique sur la valeur d'une variable ; la variable PORT doit être supérieure ou égale à 1024.

docker-bake.hcl
# Définir une variable `PORT` avec une valeur par défaut et une règle de validation
variable "PORT" {
  default = 3000  # Valeur par défaut attribuée à `PORT`

  # Bloc de validation pour s'assurer que `PORT` est un nombre valide dans la plage acceptable
  validation {
    condition = PORT >= 1024  # S'assurer que `PORT` est au moins 1024
    error_message = "La variable 'PORT' doit être supérieure ou égale à 1024."  # Message d'erreur pour les valeurs non valides
  }
}

Si l'expression condition est évaluée à false, la valeur de la variable est considérée comme non valide, ce qui entraîne l'échec de l'invocation de la construction et l'émission du message error_message. Par exemple, si PORT=443, la condition est évaluée à false, et l'erreur est levée.

Les valeurs sont converties dans le type attendu avant que la validation ne soit définie. Cela garantit que toutes les surcharges définies avec des variables d'environnement fonctionnent comme prévu.

Valider plusieurs conditions

Pour évaluer plus d'une condition, définissez plusieurs blocs validation pour la variable. Toutes les conditions doivent être true.

Voici un exemple :

docker-bake.hcl
# Définir une variable `VAR` avec plusieurs règles de validation
variable "VAR" {
  # Premier bloc de validation : S'assurer que la variable n'est pas vide
  validation {
    condition = VAR != ""
    error_message = "La variable 'VAR' ne doit pas être vide."
  }

  # Deuxième bloc de validation : S'assurer que la valeur ne contient que des caractères alphanumériques
  validation {
    # VAR et la correspondance de l'expression régulière doivent être identiques :
    condition = VAR == regex("[a-zA-Z0-9]+", VAR)
    error_message = "La variable 'VAR' ne peut contenir que des lettres et des chiffres."
  }
}

Cet exemple impose :

  • La variable ne doit pas être vide.
  • La variable doit correspondre à un jeu de caractères spécifique.

Pour les entrées non valides comme VAR="hello@world", la validation échouerait.

Valider les dépendances de variables

Vous pouvez référencer d'autres variables Bake dans votre expression de condition, ce qui permet des validations qui appliquent des dépendances entre les variables. Cela garantit que les variables dépendantes sont correctement définies avant de continuer.

Voici un exemple :

docker-bake.hcl
# Définir une variable `FOO`
variable "FOO" {}

# Définir une variable `BAR` avec une règle de validation qui référence `FOO`
variable "BAR" {
  # Bloc de validation pour s'assurer que `FOO` est défini si `BAR` est utilisé
  validation {
    condition = FOO != ""  # Vérifier si `FOO` n'est pas une chaîne vide
    error_message = "La variable 'BAR' nécessite que 'FOO' soit défini."
  }
}

Cette configuration garantit que la variable BAR ne peut être utilisée que si FOO a reçu une valeur non vide. Tenter de construire sans définir FOO déclenchera l'erreur de validation.

Échapper l'interpolation de variable

Si vous souhaitez contourner l'interpolation de variable lors de l'analyse de la définition Bake, utilisez des signes dollar doubles ($${VARIABLE}).

docker-bake.hcl
target "webapp" {
  dockerfile-inline = <<EOF
  FROM alpine
  ARG TARGETARCH
  RUN echo "Building for $${TARGETARCH/amd64/x64}"
  EOF
  platforms = ["linux/amd64", "linux/arm64"]
}
$ docker buildx bake --progress=plain
...
#8 [linux/arm64 2/2] RUN echo "Building for arm64"
#8 0.036 Building for arm64
#8 DONE 0.0s

#9 [linux/amd64 2/2] RUN echo "Building for x64"
#9 0.046 Building for x64
#9 DONE 0.1s
...

Utiliser des variables dans des variables à travers les fichiers

Lorsque plusieurs fichiers sont spécifiés, un fichier peut utiliser des variables définies dans un autre fichier. Dans l'exemple suivant, le fichier vars.hcl définit une variable BASE_IMAGE avec une valeur par défaut de docker.io/library/alpine.

vars.hcl
variable "BASE_IMAGE" {
  default = "docker.io/library/alpine"
}

Le fichier docker-bake.hcl suivant définit une variable BASE_LATEST qui référence la variable BASE_IMAGE.

docker-bake.hcl
variable "BASE_LATEST" {
  default = "${BASE_IMAGE}:latest"
}

target "webapp" {
  contexts = {
    base = BASE_LATEST
  }
}

Lorsque vous imprimez la configuration de build résolue, en utilisant l'indicateur -f pour spécifier les fichiers vars.hcl et docker-bake.hcl, vous voyez que la variable BASE_LATEST est résolue en docker.io/library/alpine:latest.

$ docker buildx bake -f vars.hcl -f docker-bake.hcl --print app
{
  "target": {
    "webapp": {
      "context": ".",
      "contexts": {
        "base": "docker.io/library/alpine:latest"
      },
      "dockerfile": "Dockerfile"
    }
  }
}

Ressources supplémentaires

Voici quelques ressources supplémentaires qui montrent comment vous pouvez utiliser des variables dans Bake :

  • Vous pouvez surcharger les valeurs de variable en utilisant des variables d'environnement. Voir Surcharger les configurations pour plus d'informations.
  • Vous pouvez vous référer et utiliser des variables globales dans les fonctions. Voir Fonctions HCL
  • Vous pouvez utiliser des valeurs de variables lors de l'évaluation d'expressions. Voir Évaluation d'expression