覆盖配置
Bake 支持从文件加载构建定义,但有时您甚至需要 更灵活地配置这些定义。例如,您可能希望 在特定环境中构建时覆盖属性,或者为 特定目标。
可以覆盖以下属性列表:
args
cache-from
cache-to
context
dockerfile
labels
no-cache
output
platform
pull
secrets
ssh
tags
target
要覆盖这些属性,您可以使用以下方法:
文件覆盖
您可以加载多个 Bake 文件,这些文件为您的 目标。当您想要将配置分成不同的 文件以便更好地组织或有条件地覆盖配置 基于加载的文件。
默认文件查找
您可以使用 or 标志指定要加载的文件。
如果未指定任何文件,则 Bake 将使用以下查找顺序:--file
-f
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
如果合并的文件包含重复的属性定义,则这些定义为 Merged 或 Overridned by the last occurrence,具体取决于属性。
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"]
}
}
}
手动文件覆盖
您可以使用该标志显式指定要加载的文件。
并将其用作有条件地应用 override 文件的方法。--file
例如,您可以创建一个文件,该文件为
特定环境,并且仅在为该环境构建时加载它。这
以下示例说明如何加载将变量设置为 .然后,该变量将在目标中使用。override.hcl
TAG
bar
TAG
default
variable "TAG" {
default = "foo"
}
target "default" {
tags = ["username/my-app:${TAG}"]
}
variable "TAG" {
default = "bar"
}
打印不带标志的构建配置显示变量设置为 default value 。--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://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 允许您使用环境变量来覆盖块的值。只有块可以被环境变量覆盖。
这意味着您需要在 bake 文件中定义变量,然后将
环境变量来覆盖它。variable
variable
以下示例显示了如何使用默认值
值,并使用环境变量覆盖它。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"]
}
}
}
类型 强制
支持使用环境变量覆盖非字符串变量。值 作为环境变量传递的变量首先被强制转换为合适的类型。
下面的示例定义一个变量。目标按原样使用变量,目标使用 incremented by 1 的值。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)
}
}
使用环境变量覆盖将首先强制该值
转换为预期类型(整数)中,然后 target 中的表达式运行。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"
}
}
}
}