シェルスクリプトでymlファイルを変更できますか?

シェルスクリプトで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'

これで(Ubuntuサーバー上)シェルスクリプトを介して何かを追加する必要があります。これが可能かどうかはわかりません。

  1. nginx/links存在しない場合は新しい要素を追加
  2. newthingnewthing-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ライブラリがあります。シェルスクリプトで直接実行できない場合は、別の言語を使用してください。

別のオプションは、コマンドラインをインストールすることです。YAMLプロセッサをクリックし、シェルスクリプトから呼び出します。

答え4

これを行う理由は、docker-composeファイルを変更するためのものなので、別のオプションはJSONファイルを使用することです。 Docker-composeは次のものをサポートしています。JSONファイル。 JSONコマンドライン操作のサポートはすでに非常に優れています(例:ジャック)

関連情報