Objetivos de matriz
Una estrategia de matriz te permite bifurcar un único objetivo (target) en múltiples variantes diferentes, basándose en los parámetros que especifiques. Esto funciona de manera similar a las estrategias de matriz para GitHub Actions. Puedes usar esto para reducir la duplicación en tu definición de Bake.
El atributo matrix es un mapa de nombres de parámetros a listas de valores. Bake compila cada combinación posible de valores como un objetivo independiente.
Cada objetivo generado debe tener un nombre único. Para especificar cómo deben resolverse los nombres de los objetivos, utiliza el atributo name.
El siguiente ejemplo resuelve el objetivo app en app-foo y app-bar. También utiliza el valor de la matriz para definir la
etapa de compilación del objetivo.
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"
}
}
}
Múltiples ejes
Puedes especificar múltiples claves en tu matriz para bifurcar un objetivo en múltiples ejes. Al utilizar múltiples claves de matriz, Bake compila cada variante posible.
El siguiente ejemplo compila cuatro objetivos:
app-foo-1-0app-foo-2-0app-bar-1-0app-bar-2-0
target "app" {
name = "app-${tgt}-${replace(version, ".", "-")}"
matrix = {
tgt = ["foo", "bar"]
version = ["1.0", "2.0"]
}
target = tgt
args = {
VERSION = version
}
}Múltiples valores por objetivo de matriz
Si deseas diferenciar la matriz en algo más que un solo valor, puedes usar mapas como valores de la matriz. Bake crea un objetivo para cada mapa, y puedes acceder a los valores anidados utilizando la notación de punto.
El siguiente ejemplo compila dos objetivos:
app-foo-1-0app-bar-2-0
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
}
}