【问题标题】:Docker-Compose file has yaml.scanner.ScannerError : mapping values are not allowed hereDocker-Compose 文件有 yaml.scanner.ScannerError : 此处不允许映射值
【发布时间】:2019-03-24 11:06:28
【问题描述】:

我的目标是在 docker 中为我的所有 docker-compose 在同一主机上的所有域中使用 1 个桥接网络。

我为我的 docker-compose 基础设施配置了 3 个 yml 文件,并且我为所有这些基础设施使用了 1 个外部网桥网络 dockerprometheus_back-tier。 一个 YAML 文件用于反向代理(traefik),每个域名一个 YAML 文件(2 个文件)。

每次我尝试使用命令 docker-compose -f mail.yml down && docker-compose -f mail.yml up -d 停止和启动最后一个 YAML 时,我都得到:

yaml.scanner.ScannerError: mapping values are not allowed here

在yml 3中注释了大部分命令后,我明白问题出在我添加name: dockerprometheus_back-tier这一行时

但是在另外 2 个 yml 文件中,我已经做了完全相同的配置来使用这个网络并且 yaml 处理器没有抱怨。

YAML 1

version: '3'

networks:
  internal:
    external: false
  prometheus:
    external: true
      name: dockerprometheus_back-tier

YAML 2

version: '3'

networks:
  onlyinternal:
    driver: bridge
    external: false
  prometheus:
    external: true
      name: dockerprometheus_back-tier


docker network ls
04e3348408c4        dockerprometheus_back-tier    bridge              local

我应用了 dos2unix 来清理 YAML 3 上的编码,但没有改变任何东西。我直接复制了 YAML 3,保留了第一行,并尝试启动它,但它也因同样的错误而失败。 docker 是否有限制从外部文件使用 3 倍相同的桥接网络?如何解决?

Docker 版本 18.09.3,内部版本 774a1f4,CentOS Linux 版本 7.6.1810(核心)

YAML 3:

version: '3'

networks:
  mail_network:
    driver: bridge
    external: false
  prometheus:
    external: true
      name: dockerprometheus_back-tier

【问题讨论】:

  • 欢迎来到Stack Overflow。指示代码块最好通过将块缩进四个空格来完成(在块上使用:Ctrl+K)。您对三反引号的使用吞噬了该行 (version: 3) 后面的文本,现在它显示了。您还应该注意,文件格式是 YAML,并且自 2006 年以来,YAML 文件的推荐扩展名一直是 .yaml

标签: networking docker-compose yaml external


【解决方案1】:

您提供的所有三个 YAML 文档都有相同的问题并且都是无效的。

作为键 external 的值,您有一个多行不带引号的标量

true name: dockerprometheus_back-tier

在不带引号的标量中,您不能有一个值指示符后跟空格,因为这可能表示一个新键。引用多行标量:

networks:
  mail_network:
    driver: bridge
    external: false
  prometheus:
    external: "true
      name: dockerprometheus_back-tier"

或者如果name 应该是与external 相同级别的键,请确保它是这样缩进的:

networks:
  mail_network:
    driver: bridge
    external: false
  prometheus:
    external: true
    name: dockerprometheus_back-tier

您可以在 YAML 中使用如下内容:

  prometheus:
    external:
      name: dockerprometheus_back-tier

但当然,一个键不能同时具有标量节点 (true) 映射节点 ('name: dockerprometheus_back-tier')

【讨论】:

  • 所以我的案子解决了,感谢 Anthon!您的回答后有 2 条评论:-> 为什么您的最后一个解决方案有效?因为“外部”键有一个“隐式空白”标量节点? --> 你知道linux上有一个好的命令行yml编辑器来帮助避免这种情况吗?
  • 我不知道编辑器,但如果你有 python3,你可以安装我的 ruamel.yaml 库并执行python3 -c "from pathlib import Path; from ruamel.yaml import YAML; YAML().load(Path('3.yaml'))",这至少可以得到@中的行号和列987654330@发生错误的地方。
猜你喜欢
  • 1970-01-01
  • 2012-02-21
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 2016-12-28
  • 2014-12-13
  • 2019-10-27
相关资源
最近更新 更多