简体中文

开发者工具 · Docker run 到 Docker compose 转换器

YAML 陷阱:引用、挪威问题和 22:22

· 背景

码头工人 撰写 yaml

说明撰写文件中 yaml 陷阱的抽象图:引用、挪威问题和 22:22
原始 ToolAcre 矢量图

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 等效性。