如何扩展YAML锚和别名并在Bash中获得生成的YAML?

时间:2019-06-13 20:52:05

标签: bash yaml

我有一个yaml文件,在其中使用锚点和别名来干燥该文件。这是一个docker-compose文件。简单例如如下:

version: "3.4"

x-build: &build
  context: ../

services:
  api:
    build:
      <<: *build
      dockerfile: some-path/Dockerfile
    image: gcr.io/some-project/api

我先使用yq,然后使用jq将其转换为json并将其传递给terraform,以便我可以重用docker-compose中的信息作为真理的来源。

所有别名和锚点均从结果json中删除。这不是灾难,但实际上扩展它会更好。

我正在寻找可以在bash脚本中运行的命令行工具,以将上面的json作为输入,并扩展锚点和别名,并将结果写入stdout ,例如:

version: "3.4"

services:
  api:
    build:
      context: ../
      dockerfile: some-path/Dockerfile
    image: gcr.io/some-project/api

有人知道该怎么做吗?

1 个答案:

答案 0 :(得分:0)

您为什么不把Yaml当作真理的来源? 您应该看看spruce。基本上,它是一个yaml / json合并工具,也可以转换为json。但是,它也会丢弃您的锚点和别名。

yml转换为json,这样就不再需要yqjq了:)

spruce json

合并yml个文件:

spruce merge file1.yml file2.yml

您的示例:

$ spruce merge spruce-input.yml
services:
  api:
    build:
      context: ../
      dockerfile: some-path/Dockerfile
    image: gcr.io/some-project/api
version: "3.4"
x-build:
  context: ../

$ spruce json spruce-input.yml | jq -r
{
  "services": {
    "api": {
      "build": {
        "context": "../",
        "dockerfile": "some-path/Dockerfile"
      },
      "image": "gcr.io/some-project/api"
    }
  },
  "version": "3.4",
  "x-build": {
    "context": "../"
  }
}