YAML 錨點與別名 (Anchors & Aliases)
當你撰寫大型的設定檔時,經常會遇到「重複」的資料。例如,多個服務共享相同的資料庫設定,或是多個任務使用相同的資源限制。
YAML 提供了一套優雅的機制:錨點 (Anchors) 與 別名 (Aliases),讓你能夠定義一次資料,並在多個地方引用它。這遵循了程式開發中的 DRY (Don't Repeat Yourself) 原則。
如何使用?
這套機制由三個核心符號組成:
&(錨點):標記一個要被引用的「來源」。*(別名):在其他位置「引用」標記好的來源。<<(合併):將引用的來源合併到當前的 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"。
為什麼要使用錨點?
- 維護方便:如果你要更改環境名稱,只需要改一個地方,所有引用的服務都會同步更新。
- 減少檔案長度:在處理大型 Kubernetes 設定或 Docker Compose 時,能大幅縮短檔案行數。
- 減少手殘錯誤:避免在多個地方複製貼上時,不小心改錯了其中一個。
注意事項
- 定義順序:錨點 (
&) 必須出現在別名 (*) 之前。 - 範圍限制:錨點通常只能在同一個 YAML 檔案(或是同一個分割文件內)使用。
- 可讀性:雖然錨點很強大,但過度使用會讓檔案變得像程式碼一樣難以直覺閱讀。建議只在「結構高度重複」的場景下使用。
小秘訣:在 Docker Compose 檔案中,經常會用
x- 開頭的鍵來存放這些錨點範本,因為以 x- 開頭的鍵會被 Docker 忽略,不會被當作真正的服務定義。學會了這些「進階偷懶技巧」後,你已經是 YAML 專家了!