矩陣目標

矩陣策略可讓您根據指定的參數將單一目標分支成多個不同的變體。這與 GitHub Actions 的矩陣策略 的運作方式類似。您可以使用它來減少 Bake 定義中的重複。

matrix 屬性是參數名稱到值清單的映射。Bake 會將每個可能的值組合建置為個別的目標。

每個產生的目標都必須具有唯一的名稱。要指定目標名稱應如何解析,請使用 name 屬性。

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

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