HCL(HashiCorp Configuration Language)是一种结构化配置语言
HCL(HashiCorp Configuration Language)是一种结构化配置语言,语法简洁且可读性强,广泛用于 Docker Buildx Bake、Terraform、Nomad 等工具的配置。以下是其核心语法规则和示例:
1. 基础结构
HCL 使用 块(Block) 和 属性(Attribute) 定义配置:
<BLOCK_TYPE> "<BLOCK_NAME>" {<ATTRIBUTE> = <VALUE>
}
-
块:用大括号
{}包裹,表示一个配置对象(如target、variable)。 -
属性:键值对,用
=赋值。
示例:
target "app" {dockerfile = "Dockerfile"platforms = ["linux/amd64"]
}
2. 常见数据类型
| 类型 | 示例 |
|---|---|
| 字符串 | "hello" 或 hello(无空格时可省略引号) |
| 数字 | 42, 3.14 |
| 布尔值 | true, false |
| 列表 | ["a", "b"] |
| 键值对映射 | { key = "value" } |
示例:
variables {image_name = "myapp" # 字符串count = 3 # 数字enabled = true # 布尔值ports = [80, 443] # 列表labels = { # 映射author = "Alice"env = "prod"}
}
3. 注释
支持单行注释 # 和多行注释 /* */:
# 这是单行注释
target "app" {/* 这是多行注释可以跨行 */dockerfile = "Dockerfile"
}
4. 变量与表达式
-
变量:通过
variable块定义,通过var.引用。 -
表达式:支持数学运算、函数调用等。
示例:
variable "platform" {default = "linux/amd64" # 默认值
}target "app" {platforms = [var.platform] # 引用变量tags = ["app:${var.platform}"] # 字符串插值
}
5. 依赖与动态配置
-
依赖块:如
depends_on定义构建顺序。 -
动态块:用
dynamic生成重复配置。
示例:
target "backend" {depends_on = ["db"] # 先构建 db,再构建 backend
}dynamic "tag" {for_each = ["v1", "latest"]content {name = "app:${tag.value}"}
}
6. Buildx Bake 专用语法
在 Docker Buildx Bake 中,常见块包括:
-
group:定义构建组。 -
target:定义构建目标(镜像)。 -
variable:声明变量。
完整示例:
variable "arch" {default = "amd64"
}group "default" {targets = ["app", "db"]
}target "app" {dockerfile = "Dockerfile.app"platforms = ["linux/${var.arch}"]tags = ["myapp:latest"]
}target "db" {dockerfile = "Dockerfile.db"platforms = ["linux/arm64"]
}
7. 与 JSON 的关系
HCL 兼容 JSON,以下两种写法等价:
# HCL 风格
target "app" {platforms = ["linux/amd64"]
}
// JSON 风格
{"target": {"app": {"platforms": ["linux/amd64"]}}
}
学习建议
-
动手实践:修改
docker-bake.hcl并运行docker buildx bake测试。 -
官方文档:
-
HCL 语法规范
-
Buildx Bake 参考
-
