覆寫設定

Bake 支援從檔案載入建置定義,但有時您需要更大的彈性來設定這些定義。例如,您可能希望在特定環境中建置或針對特定目標覆寫屬性。

可以覆寫以下屬性清單

  • args
  • cache-from
  • cache-to
  • context
  • dockerfile
  • labels
  • no-cache
  • output
  • platform
  • pull
  • secrets
  • ssh
  • tags
  • target

要覆寫這些屬性,您可以使用以下方法

檔案覆寫

您可以載入多個定義目標建置設定的 Bake 檔案。當您希望將設定分隔到不同的檔案以便更好地組織,或者根據載入的檔案有條件地覆寫設定時,這非常有用。

預設檔案查詢

您可以使用 `--file` 或 `-f` 旗標來指定要載入的檔案。如果您沒有指定任何檔案,Bake 將使用以下查詢順序

  1. compose.yaml
  2. compose.yml
  3. docker-compose.yml
  4. docker-compose.yaml
  5. docker-bake.json
  6. docker-bake.override.json
  7. docker-bake.hcl
  8. docker-bake.override.hcl

如果找到多個 Bake 檔案,所有檔案都會被載入並合併成單一定義。檔案會根據查詢順序合併。

$ docker buildx bake bake --print
[+] Building 0.0s (1/1) FINISHED                                                                                                                                                                                            
 => [internal] load local bake definitions                                                                                                                                                                             0.0s
 => => reading compose.yaml 45B / 45B                                                                                                                                                                                  0.0s
 => => reading docker-bake.hcl 113B / 113B                                                                                                                                                                             0.0s
 => => reading docker-bake.override.hcl 65B / 65B

如果合併的檔案包含重複的屬性定義,則這些定義會被合併或由最後出現的定義覆寫,具體取決於屬性。

Bake 將嘗試按照找到的順序載入所有檔案。如果多個檔案定義相同的目標,則屬性會被合併或覆寫。在覆寫的情況下,最後載入的檔案優先。

例如,給定以下檔案

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

target "default" {
  tags = ["username/my-app:${TAG}"]
}
docker-bake.override.hcl
variable "TAG" {
  default = "bar"
}

由於 `docker-bake.override.hcl` 在預設查詢順序中最後載入,因此 `TAG` 變數會被覆寫為值 `bar`。

$ docker buildx bake --print
{
  "target": {
    "default": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "tags": ["username/my-app:bar"]
    }
  }
}

手動檔案覆寫

您可以使用 `--file` 旗標明確指定要載入的檔案,並將其用作有條件地套用覆寫檔案的方法。

例如,您可以建立一個檔案來定義特定環境的一組設定,並僅在為該環境建置時載入它。以下範例顯示如何載入將 `TAG` 變數設定為 `bar` 的 `override.hcl` 檔案。然後在 `default` 目標中使用 `TAG` 變數。

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

target "default" {
  tags = ["username/my-app:${TAG}"]
}
overrides.hcl
variable "TAG" {
  default = "bar"
}

列印沒有 `--file` 旗標的建置設定會顯示 `TAG` 變數設定為預設值 `foo`。

$ docker buildx bake --print
{
  "target": {
    "default": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "tags": [
        "username/my-app:foo"
      ]
    }
  }
}

使用 `--file` 旗標載入 `overrides.hcl` 檔案會將 `TAG` 變數覆寫為值 `bar`。

$ docker buildx bake -f docker-bake.hcl -f overrides.hcl --print
{
  "target": {
    "default": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "tags": [
        "username/my-app:bar"
      ]
    }
  }
}

命令列

您也可以使用 `--set` 旗標 從命令列覆寫目標設定

# docker-bake.hcl
target "app" {
  args = {
    mybuildarg = "foo"
  }
}
$ docker buildx bake --set app.args.mybuildarg=bar --set app.platform=linux/arm64 app --print
{
  "group": {
    "default": {
      "targets": ["app"]
    }
  },
  "target": {
    "app": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "args": {
        "mybuildarg": "bar"
      },
      "platforms": ["linux/arm64"]
    }
  }
}

https://go.dev.org.tw/pkg/path/#Match

可以使用 `--set` 覆寫的屬性完整清單如下

環境變數

您也可以使用環境變數來覆寫設定。

Bake 允許您使用環境變數來覆寫 `variable` 區塊的值。只有 `variable` 區塊可以使用環境變數覆寫。這表示您需要在 bake 檔案中定義變數,然後設定具有相同名稱的環境變數來覆寫它。

以下範例顯示如何在 Bake 檔案中定義具有預設值的 `TAG` 變數,並使用環境變數覆寫它。

variable "TAG" {
  default = "latest"
}

target "default" {
  context = "."
  dockerfile = "Dockerfile"
  tags = ["docker.io/username/webapp:${TAG}"]
}
$ export TAG=$(git rev-parse --short HEAD)
$ docker buildx bake --print webapp

`TAG` 變數會被環境變數的值覆寫,該值是由 `git rev-parse --short HEAD` 生成的簡短提交雜湊。

{
  "group": {
    "default": {
      "targets": ["webapp"]
    }
  },
  "target": {
    "webapp": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "tags": ["docker.io/username/webapp:985e9e9"]
    }
  }
}

類型強制轉換

支援使用環境變數覆寫非字串變數。作為環境變數傳遞的值會先被強制轉換為合適的類型。

以下範例定義了一個 PORT 變數。backend 目標按原樣使用 PORT 變數,而 frontend 目標使用 PORT 值加一。

variable "PORT" {
  default = 3000
}

group "default" {
  targets = ["backend", "frontend"]
}

target "backend" {
  args = {
    PORT = PORT
  }
}

target "frontend" {
  args = {
    PORT = add(PORT, 1)
  }
}

使用環境變數覆寫 PORT 時,會先將值強制轉換為預期的類型(整數),然後再執行 frontend 目標中的表達式。

$ PORT=7070 docker buildx bake --print
{
  "group": {
    "default": {
      "targets": [
        "backend",
        "frontend"
      ]
    }
  },
  "target": {
    "backend": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "args": {
        "PORT": "7070"
      }
    },
    "frontend": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "args": {
        "PORT": "7071"
      }
    }
  }
}