覆盖配置

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

如果合并的文件包含重复的属性定义,则这些定义为 Merged 或 Overridned by the last occurrence,具体取决于属性。

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按默认查找顺序最后加载, 这TAGvariable 被值bar.

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

手动文件覆盖

您可以使用--file标志显式指定要加载的文件, 并将其用作有条件地应用 override 文件的方法。

例如,您可以创建一个文件,该文件为 特定环境,并且仅在为该环境构建时加载它。这 以下示例显示了如何加载override.hcl文件,该文件将TAG变量设置为bar.这TAG变量在default目标。

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

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

打印生成配置,而不打印--fileflag 显示TAGvariable 设置为默认值foo.

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

使用--file标志加载overrides.hclfile 会覆盖TAGvariable 的值为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://golang.org/pkg/path/#Match 中定义的模式匹配语法:

$ docker buildx bake --set foo*.args.mybuildarg=value  # overrides build arg for all targets starting with "foo"
$ docker buildx bake --set *.platform=linux/arm64      # overrides platform for all targets
$ docker buildx bake --set foo*.no-cache               # bypass caching only for targets starting with "foo"

可覆盖的属性的完整列表--set是:

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

环境变量

您还可以使用环境变量来覆盖配置。

Bake 允许您使用环境变量来覆盖variable块。只variable块可以用环境变量覆盖。 这意味着您需要在 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

TAGvariable 被环境变量的值覆盖, 这是由git rev-parse --short HEAD.

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

类型 强制

支持使用环境变量覆盖非字符串变量。值 作为环境变量传递的变量首先被强制转换为合适的类型。

以下示例定义了一个PORT变量。这backendtarget 使用PORT变量按原样,并且frontendtarget 使用PORT递增 1。

variable "PORT" {
  default = 3000
}

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

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

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

重写PORT使用环境变量将首先强制 转换为预期类型(整数)中,在frontendtarget 运行。

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