yaml.parser.ParserError:解析块映射时

Posted

技术标签:

【中文标题】yaml.parser.ParserError:解析块映射时【英文标题】:yaml.parser.ParserError: while parsing a block mapping 【发布时间】:2016-11-11 08:18:27 【问题描述】:
ERROR: yaml.parser.ParserError: while parsing a block mapping
  in "././tmp/statelesscs_compose.yml", line 1, column 1
expected <block end>, but found ':'
  in "././tmp/statelesscs_compose.yml", line 4, column 1
docbase installation completed

在执行下面的 yml 文件时,请您建议我如何解决这个问题。

示例用法:

docker-compose -f my.yml up

也让我知道是否有任何格式化 yml 文件的工具,以便我可以轻松修改

我的.yml:

version: '2'
services:
  ubuntupgcsstateless:
    image: ubuntupgstatelesscsimage
    environment:
      - EXTERNAL_IP=10.31.86.164
      - EXTERNALDB_IP=10.31.86.165
      - EXTERNALDB_ADMIN_USER=postgres
      - EXTERNALDB_ADMIN_PASSWORD=password
      - DOCBASENAME=DocbaseName
    hostname:
      "ubuntupgcsstateless"
    container_name:
      "ubuntupgcsstateless"
    ports:
     - "1689:1689"
     - "1690:1690"
     - "50000:50000"
     - "50001:50001"
     - "9080:9080"
     - "9082:9082"
    volumes:
     - DocbaseName_data:/home/dmadmin/dctm/data
     - DocbaseName_dba:/home/dmadmin/dctm/dba
     - DocbaseName_share:/home/dmadmin/dctm/share
     - DocbaseName_dfc:/home/dmadmin/dctm/config
     - DocbaseName_xhive_storage:/home/dmadmin/dctm/xhive_storage
     - DocbaseName_mdserver:/home/dmadmin/dctm/wildfly9.0.1/server/DctmServer_MethodServer
    privileged: true
volumes:
 DocbaseName_data:
 DocbaseName_dba:
 DocbaseName_share:
 DocbaseName_dfc:
 DocbaseName_xhive_storage:
 DocbaseName_mdserver:

【问题讨论】:

此源中没有 YAML 错误。这是您正在解析的确切来源吗?即错误消息中提到的文件statelesscs_compose.yml 【参考方案1】:

方法一:

您应该在 notepad++ 中打开您的 docker-compose.yml 文件并启用“显示所有字符”选项,以便您可以查看并纠正空格、制表符缩进问题

但如果这对你来说是一项艰巨的工作

方法二:

使用在线 YAML 验证器工具,例如 https://codebeautify.org/yaml-validator

使用此验证工具后,我可以在我的“docker-compose.yml”文件中找到问题,我有一些空格、制表符缩进问题

【讨论】:

谢谢!方法2更简单。我也使用类似的方法来解析 json 文件。【参考方案2】:

如果空格确实有空格,则您提供的 YAML 不会生成错误。因此,请检查您的 YAML 中是否有 Tab 或其他隐藏字符。

import ruamel.yaml

yaml_str = """\
version: '2'
services:
  ubuntupgcsstateless:
    image: ubuntupgstatelesscsimage
    environment:
      - EXTERNAL_IP=10.31.86.164
      - EXTERNALDB_IP=10.31.86.165
      - EXTERNALDB_ADMIN_USER=postgres
      - EXTERNALDB_ADMIN_PASSWORD=password
      - DOCBASENAME=DocbaseName
    hostname:
      "ubuntupgcsstateless"
    container_name:
      "ubuntupgcsstateless"
    ports:
     - "1689:1689"
     - "1690:1690"
     - "50000:50000"
     - "50001:50001"
     - "9080:9080"
     - "9082:9082"
    volumes:
     - DocbaseName_data:/home/dmadmin/dctm/data
     - DocbaseName_dba:/home/dmadmin/dctm/dba
     - DocbaseName_share:/home/dmadmin/dctm/share
     - DocbaseName_dfc:/home/dmadmin/dctm/config
     - DocbaseName_xhive_storage:/home/dmadmin/dctm/xhive_storage
     - DocbaseName_mdserver:/home/dmadmin/dctm/wildfly9.0.1/server/DctmServer_MethodServer
    privileged: true
volumes:
 DocbaseName_data:
 DocbaseName_dba:
 DocbaseName_share:
 DocbaseName_dfc:
 DocbaseName_xhive_storage:
 DocbaseName_mdserver:
"""

data = ruamel.yaml.round_trip_load(yaml_str)
print(ruamel.yaml.round_trip_dump(data))

尽管 YAML 规范没有要求,您应该一致地使用相同数量的空格缩进映射中的键(您使用 1 和 2 个空格,我推荐两个)以及序列中的元素(再次使用 1和 2 个空格,我建议将 0 用于映射值的序列)。

使用您的Dockerfiledocker-compose 尝试以下操作:

version: '2'
services:
  ubuntupgcsstateless:
    image: ubuntupgstatelesscsimage
    environment:
    - EXTERNAL_IP=10.31.86.164
    - EXTERNALDB_IP=10.31.86.165
    - EXTERNALDB_ADMIN_USER=postgres
    - EXTERNALDB_ADMIN_PASSWORD=password
    - DOCBASENAME=DocbaseName
    hostname:
      "ubuntupgcsstateless"
    container_name:
      "ubuntupgcsstateless"
    ports:
    - "1689:1689"
    - "1690:1690"
    - "50000:50000"
    - "50001:50001"
    - "9080:9080"
    - "9082:9082"
    volumes:
    - DocbaseName_data:/home/dmadmin/dctm/data
    - DocbaseName_dba:/home/dmadmin/dctm/dba
    - DocbaseName_share:/home/dmadmin/dctm/share
    - DocbaseName_dfc:/home/dmadmin/dctm/config
    - DocbaseName_xhive_storage:/home/dmadmin/dctm/xhive_storage
    - DocbaseName_mdserver:/home/dmadmin/dctm/wildfly9.0.1/server/DctmServer_MethodServer
    privileged: true
volumes:
  DocbaseName_data:
  DocbaseName_dba:
  DocbaseName_share:
  DocbaseName_dfc:
  DocbaseName_xhive_storage:
  DocbaseName_mdserver:

【讨论】:

以上是关于yaml.parser.ParserError:解析块映射时的主要内容,如果未能解决你的问题,请参考以下文章

解决 ERROR: yaml.parser.ParserError: while parsing a block mapping

Docker 问题集锦(21) - 解决 ERROR: yaml.parser.ParserError: while parsing a block mapping

Java自定义注解的使用

为啥数值解与 C 语言中的解析解相同?

微分方程求解草稿 未完成 仅为个人学习笔记

MOTOx怎么解锁BL,求大神解