首页 > 解决方案 > 如何扩展 YAML 锚点和别名并在 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作为输入并展开锚点和别名,并将结果写入标准输出,如下所示:

version: "3.4"

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

有谁知道如何做到这一点?

标签: bashyaml

解决方案


您为什么不将 yaml 作为事实来源?你应该看看云杉。基本上它是一个yaml/ jsonmerge 工具,也可以转换为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": "../"
  }
}

推荐阅读