json - 为什么 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 文件”,这似乎是不真实的。
那这是怎么回事?
解决方案
TL:DR:docker-compose
当他们使用基于 YAML 1.1 的加载程序加载.yml
文件时,文档在引用 YAML 1.2 的功能时具有误导性。
当您删除 TAB 时,事情会起作用,因为您基本上可以拥有非常紧凑的 JSON:{"a":[1,2,3]}
节点之间根本没有任何空格。
是的,YAML 是所有实际用途的 JSON 的超集,但您需要记住一些事项。
首先,您应该获取没有正确编写首字母缩写词(Yaml 而不是 YAML)并且不直接引用规范的文档,而是引用非权威的带有一粒盐的文档。此外,文档使用文件的扩展名.yml
,docker-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 字符)。
推荐阅读
- office365 - 是否可以在 Outlook 365 中保持任务窗格加载项打开?
- entity-framework-core - EF Core CLI 迁移数据库更新流程
- java - word2003中如何使用POI获取表格信息?
- reactjs - 如何在lib选项卡中获取选择选项卡
- reactjs - expo react native firestore 查询自动生成的文档ID
- java - 给定一个固定长度的整数数组 arr,复制每个出现的零,并将它们向右移动 - leetCode
- maven - 我们可以在 config.yaml 中的圆形 CI 中创建和运行 sonarqube 服务器吗
- heroku - 该站点在 localhost 中运行良好,但在 heroku 上部署时出现错误。error-TypeError: OAuth2Strategy 需要一个 clientID 选项
- python-3.x - 总结多个excel行
- javascript - 如何在 stackblitz 中安装丢失的软件包?