在使用 docker-compose
时,我宁愿使用 JSON 而不是 YAML,并且根据 official documentation provided by Docker ,可以使用它:
也就是说,当我尝试运行一个简单的 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/