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
测试。 -
官方文档: