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.