it-swarm.com.de

Ist es möglich, eine XML-Datei über ein Shell-Skript zu ändern?

So sieht meine docker-compose.yml aus.

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'

Jetzt muss ich einige Inhalte über ein Shell-Skript hinzufügen (auf einem Ubuntu-Server). Ich bin mir nicht ganz sicher, ob es überhaupt möglich ist:

  1. Fügen Sie nginx/links Ein neues Element hinzu, falls es nicht vorhanden ist
  2. Fügen Sie den Block newthing hinzu, wenn kein neuer Block vorhanden ist

Der neue Inhalt sollte folgendermaßen aussehen:

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'
12
user3142695

Es gibt eine Reihe von Yaml-Bibliotheken für Perl, Python usw.), wenn es in Ordnung ist, dies nicht direkt aus einem Shell-Skript heraus zu tun, sondern eine andere Sprache zu verwenden.

Eine andere Möglichkeit besteht darin, eine Befehlszeile Yaml-Prozessor zu installieren und sie von Ihrem Shell-Skript aus aufzurufen.

6
dirkt

Ich schrieb https://github.com/kislyuk/yq , einen Wrapper um https://stedolan.github.io/jq/ , um diesen Anwendungsfall anzusprechen.

8
weaver

Ich habe yaml_cli ( https://github.com/Gallore/yaml_cli ) geschrieben, um genau das zu tun, was Sie brauchen. Es basiert auf Python. Dies wäre die Syntax für Ihr Beispiel:

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

Feedback zu yaml_cli ist willkommen.

7
Andy Werner

Da der Grund dafür darin besteht, eine Docker-Compose-Datei zu ändern, besteht eine andere Alternative darin, eine JSON-Datei zu verwenden. Docker-Compose unterstützt jetzt JSON-Dateien . Die Unterstützung für die Befehlszeilenmanipulation von JSONs ist bereits sehr gut (Beispiel: jq )

1
Vivek Kodira