シェルスクリプトを介して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'

次に、シェルスクリプトを介してコンテンツを追加する必要があります(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'

1
シェルは非常に強力なスクリプト言語を提供します。あなたは簡単に使用してスクリプトを書くことができsedawkそしてregular expressions、あなたのファイルを更新します。
2017年

少し例を挙げていただけますか?
user3142695 2017年

2
これは技術的にはシェルを使用して可能ですが、実際のyamlライブラリを持つ言語を使用するほうがよいでしょう。
ジョーダン2017年

ruamel.yamlPython のライブラリを確認することをお勧めします。
2017年

:私はそれの価値は、リンクが、将来的にドッキングウィンドウから削除されますレガシー機能であることに注意だと思うdocs.docker.com/compose/compose-file/#links
ミカエル・ケアーの

回答:


6

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

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


8

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


更新できますか?
weynhamz

1
はい:yq -y '.newthing=...' input.yml > output.yml。(あなたが代わりに更新について尋ねている場合は、のようなsed -i、YQは、まだ自分自身でそれを行うことはできませんが、使用することができますspongeyq -y .newthing=... file.yml | sponge file.yml。)
ウィーバー

1
@weaverあなたは私の新しいヒーローです
voutasaurus

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


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.