在使用 docker-compose 时,我宁愿使用 JSON 而不是 YAML,并且根据 official documentation provided by Docker ,可以使用它:

json - 为什么 docker-compose 不能在 JSON 兼容模式下使用选项卡?-LMLPHP

也就是说,当我尝试运行一个简单的 compose 兼容 JSON 文件时,它失败并显示以下输出:

ERROR: yaml.scanner.ScannerError: while scanning for the next token
found character '\t' that cannot start any token
  in "./sample-file.json", line 2, column 1

但是,如果我用空格替换制表符,无论有多少(即使没有一个空格),它都会开始工作:
Starting sandbox_apache_1 ... done
Attaching to sandbox_apache_1
apache_1  | AH00558: httpd: Could not reliably...

在图片中它清楚地显示“so 任何 JSON 文件”,这似乎是不真实的。

那这又是怎么回事?

最佳答案

TL:DR:docker-compose 文档在引用 YAML 1.2 的一个特性时具有误导性,当他们使用基于 YAML 1.1 的加载器来加载他们的 .yml 文件时。

当您删除 TAB 时,事情会起作用是因为您基本上可以拥有非常紧凑的 JSON: {"a":[1,2,3]} 节点之间根本没有任何空格。

是的,YAML 是用于所有实际目的的 JSON 超集,但您需要记住一些事项。

首先,您应该获取未正确编写首字母缩略词(Yaml 而不是 YAML)并且不直接引用 spec ,而是引用带有一粒盐的非权威文档的文档。此外,documentation 使用 .yml 文件的扩展名 docker-compose.yml,尽管根据 yaml.org 上的常见问题解答,YAML 文件的推荐文件扩展名自 2006 年 9 月以来一直是 .yaml

YAML 1.2 的规范声明它旨在作为 JSON 的超集,但 docker-compose 使用 PyYAML 来解析/加载 YAML 文件,并且仅加载 YAML 1.1 的一个子集。 YAML 从 1.1 到 1.2 有一些特定的变化,使 YAML 1.2 更多但不是 100% 的 JSON 超集。

YAML 1.2 中允许使用 TAB 字符作为空格,只要这不是决定缩进的空格。由于 JSON 是流样式的 YAML,其中缩进不重要,您可以阅读它,因为在初始 {[ 之前不应该有 TAB。

在 YAML 1.1 中 restriction on using TAB is more severe :



(即,您可以在 YAML 1.1 中的非普通标量中使用 TAB 字符)。

关于json - 为什么 docker-compose 不能在 JSON 兼容模式下使用选项卡?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55459022/

10-16 09:36