È possibile modificare un file yml tramite script di shell?


12

Ecco come appare il mio 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'

Ora ho bisogno di aggiungere del contenuto tramite script di shell (su un server Ubuntu). Non sono del tutto sicuro che sia possibile:

  1. Aggiungi un nuovo elemento a nginx/links, se non esiste
  2. Aggiunge il newthingblocco se non esiste alcun blocco di newthing

Il nuovo contenuto dovrebbe apparire così:

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 fornisce un linguaggio di scripting molto potente. Si può facilmente scrivere uno script utilizzando sed, awke regular expressionsper aggiornare il file.
— fossile

Potresti per favore fornire un piccolo esempio?
— user3142695

2
Mentre questo è tecnicamente possibile usando la shell, è meglio usare un linguaggio che abbia una vera libreria yaml.
— Giordania,

Ti consiglierei di dare un'occhiata alla ruamel.yamllibreria di Python.
— phk,

Penso che valga la pena notare che i collegamenti sono una funzione legacy che verrà rimossa dalla finestra mobile in futuro: docs.docker.com/compose/compose-file/#links
— Mikael Kjær

Risposte:


6

Ci sono un certo numero di librerie yaml per Perl, Python ecc. Se è ok farlo non direttamente da uno script di shell, ma usare un'altra lingua.

Un'altra opzione è installare un processore yaml da riga di comando e chiamarlo dallo script della shell.



7

Ho scritto yaml_cli ( https://github.com/Gallore/yaml_cli ) per fare esattamente ciò di cui hai bisogno. È basato su Python. Questa sarebbe la sintassi per il tuo esempio:

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

Il feedback su yaml_cli è apprezzato.


1

Poiché il motivo per cui si desidera eseguire questa operazione è modificare un file di composizione docker, un'altra alternativa è utilizzare un file JSON. Docker-compose ora supporta i file JSON . Il supporto per la manipolazione della riga di comando di JSON è già molto buono (es: jq )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.