矩陣目標

矩陣策略允許你根據指定的引數將單個目標分叉成多個不同的變體。這與 GitHub Actions 的矩陣策略類似。你可以利用此功能減少 Bake 定義中的重複。

矩陣屬性是一個將引數名稱對映到值列表的對映。Bake 會將所有可能的值組合構建為單獨的目標。

每個生成的目標都必須有唯一的名稱。要指定目標名稱的解析方式,請使用名稱屬性。

以下示例將 app 目標解析為 `app-foo` 和 `app-bar`。它還使用矩陣值來定義目標構建階段

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"
    }
  }
}

多個軸

你可以在矩陣中指定多個鍵,以在多個軸上分叉目標。當使用多個矩陣鍵時,Bake 會構建所有可能的變體。

以下示例構建了四個目標:

  • 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
  }
}

每個矩陣目標多個值

如果你想在除了單個值之外的更多方面區分矩陣,你可以使用對映作為矩陣值。Bake 會為每個對映建立一個目標,你可以使用點符號訪問巢狀值。

以下示例構建了兩個目標

  • 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
  }
}