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'
pengguna3142695
sumber
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.

dirkt
sumber
8

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

penenun
sumber
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.

Andy Werner
sumber
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 )

Vivek Kodira
sumber