Bake中的变量
你可以在Bake文件中定义和使用变量来设置属性值,将它们插入到其他值中,并执行算术操作。变量可以定义默认值,并且可以通过环境变量进行覆盖。
使用变量作为属性值
使用 variable 块来定义一个变量。
variable "TAG" {
default = "docker.io/username/webapp:latest"
}以下示例展示了如何在目标中使用 TAG 变量。
target "default" {
context = "."
dockerfile = "Dockerfile"
tags = [ TAG ]
}将变量插入到值中
Bake 支持将变量插入到值中的字符串插值。你可以使用
${} 语法将变量插入到值中。以下示例
定义了一个值为 latest 的 TAG 变量。
variable "TAG" {
default = "latest"
}要将TAG变量插入到属性值中,请使用${TAG}语法。
target "default" {
context = "."
dockerfile = "Dockerfile"
tags = ["docker.io/username/webapp:${TAG}"]
}使用--print标志打印Bake文件,显示在解析的构建配置中的插值。
$ docker buildx bake --print
{
"group": {
"default": {
"targets": ["webapp"]
}
},
"target": {
"webapp": {
"context": ".",
"dockerfile": "Dockerfile",
"tags": ["docker.io/username/webapp:latest"]
}
}
}验证变量
要验证变量的值是否符合预期的类型、值范围或其他条件,您可以使用validation块定义自定义验证规则。
在以下示例中,验证用于对变量值强制执行数字约束;PORT变量必须为1024或更高。
# Define a variable `PORT` with a default value and a validation rule
variable "PORT" {
default = 3000 # Default value assigned to `PORT`
# Validation block to ensure `PORT` is a valid number within the acceptable range
validation {
condition = PORT >= 1024 # Ensure `PORT` is at least 1024
error_message = "The variable 'PORT' must be 1024 or higher." # Error message for invalid values
}
}如果condition表达式的计算结果为false,则变量值被视为无效,从而导致构建调用失败并发出error_message。例如,如果PORT=443,条件计算结果为false,则会引发错误。
在设置验证之前,值会被强制转换为预期的类型。这确保了使用环境变量设置的任何覆盖都能按预期工作。
验证多个条件
要评估多个条件,请为变量定义多个validation块。所有条件必须为true。
这是一个例子:
# Define a variable `VAR` with multiple validation rules
variable "VAR" {
# First validation block: Ensure the variable is not empty
validation {
condition = VAR != ""
error_message = "The variable 'VAR' must not be empty."
}
# Second validation block: Ensure the value contains only alphanumeric characters
validation {
# VAR and the regex match must be identical:
condition = VAR == regex("[a-zA-Z0-9]+", VAR)
error_message = "The variable 'VAR' can only contain letters and numbers."
}
}这个例子强制执行:
- 变量不能为空。
- 变量必须匹配特定的字符集。
对于像VAR="hello@world"这样的无效输入,验证将失败。
验证变量依赖关系
您可以在条件表达式中引用其他Bake变量,从而实现对变量之间依赖关系的验证。这确保了在继续之前,依赖变量被正确设置。
这是一个例子:
# Define a variable `FOO`
variable "FOO" {}
# Define a variable `BAR` with a validation rule that references `FOO`
variable "BAR" {
# Validation block to ensure `FOO` is set if `BAR` is used
validation {
condition = FOO != "" # Check if `FOO` is not an empty string
error_message = "The variable 'BAR' requires 'FOO' to be set."
}
}此配置确保只有在FOO被赋予非空值时才能使用BAR变量。尝试在不设置FOO的情况下构建将触发验证错误。
转义变量插值
如果你想在解析Bake定义时绕过变量插值,请使用双美元符号($${VARIABLE})。
target "default" {
dockerfile-inline = <<EOF
FROM alpine
ARG TARGETARCH
RUN echo "Building for $${TARGETARCH/amd64/x64}"
EOF
platforms = ["linux/amd64", "linux/arm64"]
}$ docker buildx bake --progress=plain
...
#8 [linux/arm64 2/2] RUN echo "Building for arm64"
#8 0.036 Building for arm64
#8 DONE 0.0s
#9 [linux/amd64 2/2] RUN echo "Building for x64"
#9 0.046 Building for x64
#9 DONE 0.1s
...
在跨文件中使用变量中的变量
当指定多个文件时,一个文件可以使用另一个文件中定义的变量。在以下示例中,vars.hcl 文件定义了一个 BASE_IMAGE 变量,其默认值为 docker.io/library/alpine。
variable "BASE_IMAGE" {
default = "docker.io/library/alpine"
}以下 docker-bake.hcl 文件定义了一个引用 BASE_IMAGE 变量的 BASE_LATEST 变量。
variable "BASE_LATEST" {
default = "${BASE_IMAGE}:latest"
}
target "default" {
contexts = {
base = BASE_LATEST
}
}当你使用-f标志指定vars.hcl和docker-bake.hcl文件来打印解析后的构建配置时,你会看到BASE_LATEST变量被解析为docker.io/library/alpine:latest。
$ docker buildx bake -f vars.hcl -f docker-bake.hcl --print app
{
"target": {
"default": {
"context": ".",
"contexts": {
"base": "docker.io/library/alpine:latest"
},
"dockerfile": "Dockerfile"
}
}
}额外资源
以下是一些额外的资源,展示了如何在Bake中使用变量: