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