这就是我的 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 服务器上)添加一些内容。我不太确定这是否可能:
- 添加新元素(
nginx/links
如果不存在) 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 脚本中调用它。