首页 > 解决方案 > 为什么 docker-compose 不能在 JSON 兼容模式下使用选项卡?

问题描述

在使用docker-compose时,我宁愿使用 JSON 而不是 YAML,根据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...

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

那这是怎么回事?

标签: jsondockerdocker-composeyaml

解决方案


TL:DR:docker-compose当他们使用基于 YAML 1.1 的加载程序加载.yml文件时,文档在引用 YAML 1.2 的功能时具有误导性。

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


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

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

YAML 1.2 的规范声明它旨在作为 JSON 的超集,但docker-compose使用 PyYAML 来解析/加载 YAML 文件并且仅加载 YAML 1.1 的子集。从 1.1 到 1.2 对 YAML 进行了特定更改,以使 YAML 1.2 更多,但不是 100% 的 JSON 超集。

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

在 YAML 1.1 中,使用 TAB 的限制更加严格

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

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


推荐阅读