是否可以通过shell脚本修改yml文件?

是否可以通过shell脚本修改yml文件?

这就是我的 docker-compose.yml 的样子。

nginx:
  container_name: 'nginx'
  image: 'nginx:1.11'
  restart: 'always'
  ports:
    - '80:80'
    - '443:443'
  volumes:
    - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
  links:
    - 'anything'

现在我需要通过 shell 脚本(在 ubuntu 服务器上)添加一些内容。我不太确定这是否可能:

  1. 添加新元素(nginx/links如果不存在)
  2. newthing如果不存在 newthing-block 则追加块

新内容应如下所示:

nginx:
  container_name: 'nginx'
  image: 'nginx:1.11'
  restart: 'always'
  ports:
    - '80:80'
    - '443:443'
  volumes:
    - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
    - '/etc/letsencrypt:/etc/letsencrypt'
  links:
    - 'anything'
    - 'newthing'

newthing:
  container_name: foo
  image: 'newthing:1.2.3'
  restart: always
  hostname: 'example.com'

答案1

我写https://github.com/kislyuk/yq,一个包装器https://stedolan.github.io/jq/,来解决这个用例。

答案2

我写了 yaml_cli (https://github.com/Gallore/yaml_cli)完全按照您的需要去做。它是基于Python的。这将是您的示例的语法:

yaml_cli \
  -f docker-compose.yml \                # read from and save to file
  --list-append \                        # flag to append to lists instead of replacing existing values
  -s nginx:links newthing \              # add a value of type string; here you need --list-append
  -s newthing:container_name foo \       # key 'newthing' is created automatically
  -s newthing:image 'newthing:1.2.3' \   #
  -s newthing:restart always \           #
  -s newthing:hostname 'example.com'     #

欢迎提供有关 yaml_cli 的反馈。

答案3

有许多用于 Perl、Python 等的 yaml 库。如果可以不直接从 shell 脚本执行,而是使用其他语言。

另一种选择是安装命令行yaml处理器,然后从 shell 脚本中调用它。

答案4

由于您想要执行此操作的原因是修改 docker-compose 文件,因此另一种选择是使用 JSON 文件。 Docker-compose 现在支持JSON 文件。对 JSON 命令行操作的支持已经非常好(例如:杰克

相关内容