È 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.