使用 Bake 配置构建
Bake 支持从文件加载构建定义,但有时您需要更大的灵活性来配置这些定义。
对于此用例,您可以在烘焙文件中定义变量,这些变量可以由用户使用环境变量或
其他烘焙文件中的属性定义来设置。如果您希望更改单次调用的特定值,您可以使用命令行中的--set
标志
。
全局范围属性
您可以在 HCL/JSON 中定义全局范围属性,并将它们用于代码重用和设置变量值。这意味着您可以使用要设置/覆盖的值创建“仅数据”HCL 文件,并在常规输出文件列表中使用它。
# docker-bake.hcl
variable "FOO" {
default = "abc"
}
target "app" {
args = {
v1 = "pre-${FOO}"
}
}
您可以直接使用该文件:
$ docker buildx bake --print app
{
"group": {
"default": {
"targets": ["app"]
}
},
"target": {
"app": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"v1": "pre-abc"
}
}
}
}
或者创建一个覆盖配置文件:
# env.hcl
WHOAMI="myuser"
FOO="def-${WHOAMI}"
并与这两个文件一起调用烘焙:
$ docker buildx bake -f docker-bake.hcl -f env.hcl --print app
{
"group": {
"default": {
"targets": ["app"]
}
},
"target": {
"app": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"v1": "pre-def-myuser"
}
}
}
}
资源插值
您还可以引用定义为其他目标一部分的属性,以帮助减少目标之间的重复。
# docker-bake.hcl
target "foo" {
dockerfile = "${target.foo.name}.Dockerfile"
tags = [target.foo.name]
}
target "bar" {
dockerfile = "${target.foo.name}.Dockerfile"
tags = [target.bar.name]
}
您可以直接使用该文件:
$ docker buildx bake --print foo bar
{
"group": {
"default": {
"targets": ["foo", "bar"]
}
},
"target": {
"foo": {
"context": ".",
"dockerfile": "foo.Dockerfile",
"tags": ["foo"]
},
"bar": {
"context": ".",
"dockerfile": "foo.Dockerfile",
"tags": ["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"
可覆盖字段的完整列表:
args
cache-from
cache-to
context
dockerfile
labels
no-cache
output
platform
pull
secrets
ssh
tags
target
跨文件使用变量中的变量
当指定多个文件时,一个文件可以使用另一文件中定义的变量。
# docker-bake1.hcl
variable "FOO" {
default = upper("${BASE}def")
}
variable "BAR" {
default = "-${FOO}-"
}
target "app" {
args = {
v1 = "pre-${BAR}"
}
}
# docker-bake2.hcl
variable "BASE" {
default = "abc"
}
target "app" {
args = {
v2 = "${FOO}-post"
}
}
$ docker buildx bake -f docker-bake1.hcl -f docker-bake2.hcl --print app
{
"group": {
"default": {
"targets": ["app"]
}
},
"target": {
"app": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"v1": "pre--ABCDEF-",
"v2": "ABCDEF-post"
}
}
}
}