Apakah mungkin untuk memodifikasi file yml melalui skrip shell?


12

Ini adalah bagaimana docker-compose.yml saya terlihat.

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'

Sekarang saya perlu menambahkan beberapa konten melalui skrip shell (di server ubuntu). Saya tidak yakin apakah itu mungkin:

  1. Tambahkan elemen baru ke nginx/links, jika tidak ada
  2. Tambahkan newthingblok jika tidak ada blok-hal baru

Konten baru akan terlihat seperti ini:

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 memberi Anda bahasa skrip yang sangat kuat. Anda dapat dengan mudah menulis skrip menggunakan sed, awkdan regular expressionsmemperbarui file Anda.
— fosil

Bisakah Anda memberikan sedikit contoh?
— user3142695

2
Meskipun ini secara teknis dimungkinkan menggunakan shell, Anda harus lebih baik menggunakan bahasa yang memiliki pustaka yaml yang sebenarnya.
— jordanm

Saya akan menyarankan Anda untuk memeriksa ruamel.yamlperpustakaan untuk Python.
— phk

Saya pikir patut dicatat bahwa tautan adalah fitur warisan yang akan dihapus dari buruh pelabuhan di masa mendatang: docs.docker.com/compose/compose-file/#links
— Mikael Kjær

Jawaban:


6

Ada sejumlah perpustakaan yaml untuk Perl, Python dll. Jika boleh melakukannya tidak langsung dari skrip shell, tetapi gunakan bahasa lain.

Pilihan lain adalah menginstal prosesor yaml baris perintah , dan memanggilnya dari skrip shell Anda.


8

Saya menulis https://github.com/kislyuk/yq , pembungkus di sekitar https://stedolan.github.io/jq/ , untuk mengatasi kasus penggunaan ini.


Bisakah itu melakukan pembaruan?
— weynhamz

1
Ya: yq -y '.newthing=...' input.yml > output.yml. (Jika Anda bertanya tentang pembaruan di tempat, seperti sed -i, yq belum bisa melakukannya sendiri, tetapi Anda dapat menggunakan sponge:. yq -y .newthing=... file.yml | sponge file.yml)
— weaver

1
@weaver kamu adalah pahlawan
— baruku

7

Saya menulis yaml_cli ( https://github.com/Gallore/yaml_cli ) untuk melakukan apa yang Anda butuhkan. Ini didasarkan pada python. Ini akan menjadi sintaksis untuk contoh Anda:

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'     #

Umpan balik tentang yaml_cli sangat dihargai.


1

Karena alasan Anda ingin melakukan ini adalah untuk memodifikasi file menulis buruh pelabuhan, alternatif lain adalah menggunakan file JSON. Susunan docker sekarang mendukung file JSON . Dukungan untuk manipulasi baris perintah JSON sudah sangat bagus (mis: jq )

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.