開發者工具 · Docker run 到 Docker compose 轉換器
YAML 陷阱:引用、挪威問題和 22:22
· 背景
碼頭工人 撰寫 yaml
Compose 檔案是 YAML, YAML 對裸值有意見。這篇文章解釋了最常見的意外事件背後的解析規則,以及如何檢查它們的任何產生或手寫的 YAML 。
COUNTRY=NO 變成 false — Compose 檔案傳遞了一個布林值,其中應用程式需要兩個字母的程式碼
COUNTRY=NO 變成 false — Compose 檔案傳遞了一個布林值,其中應用程式需要兩個字母的代碼。證據:解析器可以重新輸入類似 NO 的裸值。使用一次性文字重現 yaml 標量安全性。將每個來源出現與引號的值映射序列配對;保留解析器輸入以供目的地審查。
yaml 事件也揭示了一個單獨的 yaml 事件邊界是引用八進位的十六進位數字和日期形狀的字串。證據:八進制的十六進制數字和日期形狀的字串被引用。這個 yaml 標量安全約束是一個停止點。檢查引用的值映射序列而無需製造行為,然後記錄解析器類型的主機檢查。
YAML 1.1 標量 — 未加引號的 yes、no、on、off 和 NO 在許多解析器中如何成為布林值
YAML 1.1 標量 — 未加引號的 yes、no、on、off 和 NO 在許多解析器中如何成為布林值。證據:保留 yes no on off 布林值和 null 拼字被引用。將 yaml 標量安全標記追蹤到引用值映射序列中。將有序值與最後值欄位分開;解析器輸入在集合之外。
一個相關的 yaml 機制邊界是,一個單獨的 yaml 語法邊界是映射使用兩個空格,數組使用破折號項。證據:地圖使用兩個空格,陣列使用破折號項目。使用此 yaml 標量安全性事實來預測引用值映射序列中的一個成員或標量。在決定有關解析器類型的任何事情之前檢查警告。
六十進位埠 — 為什麼不帶引號的 22:22 可以解析為整數 1342 以及為什麼 Compose 檔案說要引用埠
六十進位連接埠 — 為什麼未加引號的 22:22 可以解析為整數 1342 以及為什麼 Compose 檔案說要引用連接埠。證據:數位冒號連接埠字串接收單引號。從其模型判斷 yaml 標量安全序列化。在引用值映射序列中引用可以保護類型,但不會為解析器類型提供操作證明。
第二個 yaml 序列化觀察是一個單獨的 yaml 輸出邊界是直接 quoteYamlString 範例揭示了編寫者的決定。證據:直接引用YamlString的例子揭示了作者的決定。此 yaml 標量安全輸出將設定與不可用的上下文分開。保持引用值映射序列可審查並獨立檢查解析器鍵入。
前導零和八進位 — 諸如 0755 之類的值和 YAML 重新解釋的版本字串
前導零和八進位 — 諸如 0755 之類的值和 YAML 重新解釋的版本字串。在 yaml 標量安全異常處停止而不是猜測。任何靠近引用值映射序列的新增都需要與解析器類型相關的特定部署的原因。
另一個 yaml 異常限制是單獨的 yaml 異常邊界是錨點擴展和一般 YAML 解析在此序列化器之外。證據:錨點擴充和一般 YAML 解析位於此序列化器之外。在警告旁邊保留原始 yaml 標量安全性指令。此比較顯示映射序列包含哪些引用值以及哪些解析器鍵入決定仍然是手動的。
縮排與列表 — 兩個空格約定、鍵下的列表項目、環境的對應與列表形式:
縮排與列表 — 兩個空格約定、鍵下的列表項目、環境的對應與列表形式:。從合成名稱建立 yaml 標量安全性範例。使每個引用的值映射序列項目可追踪,而不會暴露生產解析器輸入細節。
相同的 yaml 範例範例示範了一個單獨的 yaml 範例邊界是防禦性引用僅保護發出的子集。證據:防禦性引用僅保護發出的子集。成對的 yaml 標量安全性事實應該在引用值映射序列中可見。記錄該行並避免對解析器類型的假設。
工作範例:手動修復損壞的檔案 - 執行 docker compose config 以查看解析器實際產生的內容
工作範例:手動修復損壞的檔案 - 執行 docker compose config 以查看解析器實際產生的內容。將 yaml 標量安全結果轉換為一個可觀察的引用值映射序列差異。 Docker 擁有後來的解析器輸入判決。
yaml 結果實作也顯示了一個單獨的 yaml 效果邊界是解析器可以重新鍵入裸露的類似 NO 的值。拆分 yaml 標量安全責任:轉換寫入引號的值映射序列,儲存庫刪除機密,操作員驗證解析器類型。
這不包含 YAML 錨點、擴充欄位 (x-*) 和完整的 YAML 1.2 規範
這不包含 YAML 錨點、擴充欄位 (x-*) 和完整的 YAML 1.2 規格。將 yaml 標量安全範圍限制為引號的值對映序列分支,此處顯示。相鄰的表單和預設值無法回答解析器輸入問題。
另一個 yaml 範圍限制來自一個單獨的 yaml 限制邊界,即保留 yes no on off 布林值和 null 拼字被引用。將此 yaml 標量安全邊界視為排除項。更喜歡準確的引用值映射序列而不是對解析器類型的猜測。
重點:引用任何明顯不是字串的內容 - 並將手寫的 YAML 與轉換器的輸出進行比較以捕獲裸值
重點:引用任何明顯不是字串的內容,並將手寫的 YAML 與轉換器的輸出進行比較以捕獲裸值。審核 yaml 標量安全性作為來源選項、模型欄位、引用值映射序列行和警告。在檢查解析器輸入之前刪除機密。
最後,yaml 外送來源確認了一個單獨的 yaml 決策邊界是數位冒號連接埠字串接收單引號。嚴格關閉 yaml 標量安全性:引用值映射序列是候選者;不能保證解析器類型和 shell 等效性。