web-dev-qa-db-ja.com

シェルスクリプトを介して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. Newthingブロックが存在しない場合は、newthingブロックを追加します

新しいコンテンツは次のようになります。

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'
12
user3142695

Perl用の多くのyamlライブラリがあります。シェルスクリプトから直接ではなく別の言語を使用する場合は、Pythonなど)です。

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

6
dirkt

このユースケースに対処するために、 https://stedolan.github.io/jq/ のラッパーである https://github.com/kislyuk/yq を書きました。

8
weaver

私は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に関するフィードバックを歓迎します。

7
Andy Werner

これを行う理由は、docker-composeファイルを変更することであるため、JSONファイルを使用することもできます。 Docker-composeが JSONファイル をサポートするようになりました。 JSONのコマンドライン操作のサポートはすでに非常に優れています(例: jq

1
Vivek Kodira