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

Cibles de matrice

Une stratégie de matrice vous permet de diviser une seule cible en plusieurs variantes différentes, en fonction des paramètres que vous spécifiez. Cela fonctionne de manière similaire aux stratégies de matrice pour les actions GitHub. Vous pouvez l'utiliser pour réduire la duplication dans votre définition Bake.

L'attribut de matrice est une carte de noms de paramètres à des listes de valeurs. Bake construit chaque combinaison possible de valeurs comme une cible distincte.

Chaque cible générée doit avoir un nom unique. Pour spécifier comment les noms de cibles doivent être résolus, utilisez l'attribut de nom.

L'exemple suivant résout la cible de l'application en app-foo et app-bar. Il utilise également la valeur de la matrice pour définir l' étape de construction de la cible.

docker-bake.hcl
target "app" {
  name = "app-${tgt}"
  matrix = {
    tgt = ["foo", "bar"]
  }
  target = tgt
}
$ docker buildx bake --print app
[+] Building 0.0s (0/0)
{
  "group": {
    "app": {
      "targets": [
        "app-foo",
        "app-bar"
      ]
    },
    "default": {
      "targets": [
        "app"
      ]
    }
  },
  "target": {
    "app-bar": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "target": "bar"
    },
    "app-foo": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "target": "foo"
    }
  }
}

Axes multiples

Vous pouvez spécifier plusieurs clés dans votre matrice pour diviser une cible sur plusieurs axes. Lorsque vous utilisez plusieurs clés de matrice, Bake construit chaque variante possible.

L'exemple suivant construit quatre cibles :

  • app-foo-1-0
  • app-foo-2-0
  • app-bar-1-0
  • app-bar-2-0
docker-bake.hcl
target "app" {
  name = "app-${tgt}-${replace(version, ".", "-")}"
  matrix = {
    tgt = ["foo", "bar"]
    version = ["1.0", "2.0"]
  }
  target = tgt
  args = {
    VERSION = version
  }
}

Plusieurs valeurs par cible de matrice

Si vous souhaitez différencier la matrice sur plus qu'une seule valeur, vous pouvez utiliser des cartes comme valeurs de matrice. Bake crée une cible pour chaque carte, et vous pouvez accéder aux valeurs imbriquées en utilisant la notation par points.

L'exemple suivant construit deux cibles :

  • app-foo-1-0
  • app-bar-2-0
docker-bake.hcl
target "app" {
  name = "app-${item.tgt}-${replace(item.version, ".", "-")}"
  matrix = {
    item = [
      {
        tgt = "foo"
        version = "1.0"
      },
      {
        tgt = "bar"
        version = "2.0"
      }
    ]
  }
  target = item.tgt
  args = {
    VERSION = item.version
  }
}