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

为什么docker compose不能在JSON兼容模式下使用选项卡?,json,docker,docker-compose,yaml,Json,Docker,Docker Compose,Yaml,在使用docker compose时,我宁愿使用JSON而不是YAML,根据,可以使用它: 也就是说,当我尝试运行一个简单的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, colu

在使用
docker compose
时,我宁愿使用JSON而不是YAML,根据,可以使用它:

也就是说,当我尝试运行一个简单的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...
在图片中,它清楚地表示“soanyJSON文件”,这似乎是不真实的


那么,这是怎么回事?

TL:DR:docker compose文档引用了YAML 1.2的一个特性,这是误导性的,因为他们使用基于YAML 1.1的加载程序加载
.yml
文件

当您删除这些选项卡时,事情会起作用,因为您基本上可以使用非常紧凑的JSON:
{“a”:[1,2,3]}
,节点之间没有任何空格


是的,YAML是JSON的超集,用于所有实际用途,但有几件事需要记住

首先,您应该获取那些没有正确编写首字母缩写词(Yaml而不是Yaml)的文档,并且这些文档没有直接引用,而是引用了一篇非作者的文章。此外,对于
docker compose.yml
文件,使用扩展名
.yml
,但根据YAML.org上的常见问题解答,自2006年9月以来,YAML文件的推荐文件扩展名为
.YAML

YAML 1.2的规范声明它是JSON的超集,但是docker compose使用PyYAML解析/加载YAML文件,并且只加载YAML 1.1的一个子集。YAML从1.1到1.2做了一些具体的更改,使YAML 1.2更像JSON,但不是JSON的100%超集

YAML 1.2中允许制表符用于空格,只要空格不是决定缩进的空格。由于JSON是流式YAML,其中缩进应该不重要,因此您可以阅读它,因为在首字母
{
[
之前不应该有选项卡

在YAML 1.1中:

标量内容外被忽略的空格字符。此类空格用于标记之间的缩进和分隔。为了保持可移植性,在这些情况下不能使用制表符,因为不同的系统对制表符的处理不同

(即,在YAML 1.1中,可以使用非纯标量的制表符)