YAML 錨點與別名 (Anchors & Aliases)

當你撰寫大型的設定檔時,經常會遇到「重複」的資料。例如,多個服務共享相同的資料庫設定,或是多個任務使用相同的資源限制。

YAML 提供了一套優雅的機制:錨點 (Anchors)別名 (Aliases),讓你能夠定義一次資料,並在多個地方引用它。這遵循了程式開發中的 DRY (Don't Repeat Yourself) 原則。

如何使用?

這套機制由三個核心符號組成:

  1. & (錨點):標記一個要被引用的「來源」。
  2. * (別名):在其他位置「引用」標記好的來源。
  3. << (合併):將引用的來源合併到當前的 Map 結構中。

基本引用範例

假設你有兩個服務需要完全相同的日誌設定:

# 定義一個來源,並給它一個名字叫 logs
log_config: &logs
  level: "debug"
  path: "/var/log/app.log"
  format: "json"

service_a:
  name: "Auth Service"
  logging: *logs  # 直接引用 logs 的內容

service_b:
  name: "Order Service"
  logging: *logs  # 同樣引用 logs

合併與覆寫 (Merge Key <<)

這是最實用的技巧。你可以引用一個基礎範本,然後「覆蓋」其中一部分的值,或是「新增」額外的欄位。

# 1. 定義基礎範本
common_settings: &base
  environment: "production"
  timeout: 30
  retries: 3

# 2. 合併並擴展
web_service:
  <<: *base          # 合併基礎範本的所有內容
  name: "Web"        # 新增欄位
  timeout: 60        # 覆寫原本 base 中的 timeout

解析後的結果: web_service 將擁有 environment: "production", timeout: 60, retries: 3, name: "Web"

為什麼要使用錨點?

  1. 維護方便:如果你要更改環境名稱,只需要改一個地方,所有引用的服務都會同步更新。
  2. 減少檔案長度:在處理大型 Kubernetes 設定或 Docker Compose 時,能大幅縮短檔案行數。
  3. 減少手殘錯誤:避免在多個地方複製貼上時,不小心改錯了其中一個。

注意事項

  • 定義順序:錨點 (&) 必須出現在別名 (*) 之前。
  • 範圍限制:錨點通常只能在同一個 YAML 檔案(或是同一個分割文件內)使用。
  • 可讀性:雖然錨點很強大,但過度使用會讓檔案變得像程式碼一樣難以直覺閱讀。建議只在「結構高度重複」的場景下使用。
小秘訣:在 Docker Compose 檔案中,經常會用 x- 開頭的鍵來存放這些錨點範本,因為以 x- 開頭的鍵會被 Docker 忽略,不會被當作真正的服務定義。

學會了這些「進階偷懶技巧」後,你已經是 YAML 專家了!