Bir yml dosyasını kabuk betiği ile değiştirmek mümkün müdür?


12

Benim docker-compose.yml böyle görünüyor.

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'

Şimdi kabuk komut dosyası (ubuntu sunucusunda) üzerinden bazı içerik eklemem gerekiyor. Hiç mümkün olup olmadığından emin değilim:

  1. nginx/linksVarsa, yeni öğe ekle
  2. Yeni newthingblok yoksa, blok ekle

Yeni içerik şöyle görünmelidir:

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 size çok güçlü komut dosyası yazma dili sağlar. Kolayca kullanarak bir komut dosyası yazabilirsiniz sed, awkve regular expressionsdosyanızı güncellemek için.
fosil

Lütfen küçük bir örnek verebilir misiniz?
user3142695

2
Kabuk kullanarak teknik olarak bu mümkün olsa da, gerçek bir yaml kütüphanesi olan bir dili kullanarak daha iyi durumda olmalısınız.
2017'de

ruamel.yamlPython kütüphanesine bakmanızı tavsiye ederim .
phk

Bağlantıların gelecekte docker'dan
Mikael Kjær

Yanıtlar:


6

Doğrudan bir kabuk komut dosyasından değil, başka bir dil kullanmanız uygunsa, Perl, Python vb. İçin bir dizi yaml kütüphanesi vardır.

Başka bir seçenek, bir komut satırı yaml işlemcisi yüklemek ve kabuk komut dosyanızdan çağırmaktır.


8

Bu kullanım durumunu ele almak için https://stedolan.github.io/jq/ etrafında bir paket olan https://github.com/kislyuk/yq yazdım .


Güncelleme yapabilir mi?
weynhamz

1
Evet: yq -y '.newthing=...' input.yml > output.yml. (Yerinde bir güncelleme hakkında soruyorsan gibi sed -i, yq henüz kendisi tarafından yapamazsınız, ancak kullanabilirsiniz sponge: yq -y .newthing=... file.yml | sponge file.yml.)
Weaver

1
@weaver sen benim yeni kahramanım
voutasaurus

7

Tam olarak ihtiyacınız olanı yapmak için yaml_cli ( https://github.com/Gallore/yaml_cli ) yazdım . Python'a dayanıyor. Bu, örneğinizin sözdizimi olacaktır:

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 hakkında geri bildirim takdir edilmektedir.


1

Bunu yapmak istemenizin nedeni bir docker-compose dosyasını değiştirmek olduğundan başka bir alternatif de JSON dosyası kullanmaktır. Docker-compose artık JSON dosyalarını destekliyor . JSON'ların komut satırı manipülasyonu desteği zaten çok iyi (ör: jq )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.