覆寫設定
Bake 支援從檔案載入建置定義,但有時您需要更大的彈性來設定這些定義。例如,您可能希望在特定環境中建置或針對特定目標覆寫屬性。
可以覆寫以下屬性清單
args
cache-from
cache-to
context
dockerfile
labels
no-cache
output
platform
pull
secrets
ssh
tags
target
要覆寫這些屬性,您可以使用以下方法
檔案覆寫
您可以載入多個定義目標建置設定的 Bake 檔案。當您希望將設定分隔到不同的檔案以便更好地組織,或者根據載入的檔案有條件地覆寫設定時,這非常有用。
預設檔案查詢
您可以使用 `--file` 或 `-f` 旗標來指定要載入的檔案。如果您沒有指定任何檔案,Bake 將使用以下查詢順序
compose.yaml
compose.yml
docker-compose.yml
docker-compose.yaml
docker-bake.json
docker-bake.override.json
docker-bake.hcl
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 將嘗試按照找到的順序載入所有檔案。如果多個檔案定義相同的目標,則屬性會被合併或覆寫。在覆寫的情況下,最後載入的檔案優先。
例如,給定以下檔案
variable "TAG" {
default = "foo"
}
target "default" {
tags = ["username/my-app:${TAG}"]
}
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` 變數。
variable "TAG" {
default = "foo"
}
target "default" {
tags = ["username/my-app:${TAG}"]
}
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"]
}
}
}