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 参考
-