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


12

这就是我的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
Shell为您提供了非常强大的脚本语言。您可以轻松地使用编写脚本sedawkregular expressions更新文件。
化石

您能举个例子吗?
user3142695'1

2
尽管使用Shell在技术上是可行的,但最好使用具有实际yaml库的语言。
jordanm

我建议您检查一下ruamel.yamlPython库。
phk

我认为这是值得一提的是链接将从码头工人在将来被移除的原有功能:docs.docker.com/compose/compose-file/#links
的MikaelKjær的

Answers:


6

有许多针对Perl,Python等的yaml库。如果可以的话,不要直接从shell脚本中直接使用,而是要使用另一种语言。

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



7

我写了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的反馈。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.