2017-12-28 9 views
1

Ich möchte Shell-Erweiterung mit Standardwerten in YAML-Datei unter Beibehaltung seiner Struktur und führende Leerzeichen, um es nutzbar zu halten.Shell-Variablen-Erweiterung in Textdatei, die Whitespace (z. B. docker-compose.yml in Rancher)

Zum Beispiel:

version: 2 

services: 
    postgres: 
     image: ${POSTGRESQL_IMAGE:-my-private-registry/postgres}:${POSTGRESQL_BUILD:-9.6}" 
     labels: 
      io.rancher.scheduler.affinity:host_label: myproject=true 

    myapp: 
     image: ${APP_IMAGE:-my-private-registry/myapp}:${APP_BUILD:-latest} 
     depends_on: 
      - postgres 
... 

Ausgabe sollte wie:

version: 2 

services: 
    postgres: 
     image: my-private-registry/postgres:9.6 
     labels: 
      io.rancher.scheduler.affinity:host_label: myproject=true 

    myapp: 
     image: my-private-registry/myapp:latest 
     depends_on: 
      - postgres 
... 

Ich mag würde renderes Docker-Compose-Datei zu erhalten, so kann ich es Rancher Pass, unterstützt nur version 2 ohne Schale Erweiterung.

Was ist die beste und zuverlässige Lösung dafür?

Ich habe versucht:

  • envsubst aber es kann nur primitive substitiutions
  • Shell eval durchführen, aber es entfernt führende Leerzeichen und korrumpiert Datei

Antwort

1

Schließlich ich in die Lösung kam mit eval Raum zu bewahren:

while IFS= read -r; do eval echo "\"""${REPLY}""\""; done < docker-compose.yml 

Erläuterung:

  • IFS= Sätze für read Befehl kein Trenn so die Zeichenfolge (optional)

  • read -r bewahrt Schrägstriche in der Datei

  • read genannt ohne Variablenname setzt nicht aufzuspalten versucht die ganze Zeichenfolge ohne Leerzeichen trimmen in die Standardvariable REPLY

  • echo "\"""${REPLY}""\"" macht variabel und hält erforderliche Anzahl von doppelten Anführungszeichen um es Zeichenfolge richtig druckbar zu machen

UPDATE:

Auch ist es durchaus sinnvoll zu ändern version:

while read -r; do eval echo "\"""${REPLY}""\""; done < docker-compose.yml \ 
    | awk 'NR==1 && ($0~"version:") {print "version: 2"} NR!=1 {print}' 
0

Sieht leichter Ich mache die Variablen-Erweiterung in Ihrem Shell-Skript (anstelle von während) und ersetzen Sie dann die .yml mit sed (mit einfacheren Keywords, um die Ersetzung zu tun nt)

+0

Vielen Dank für die Meinung. Ich habe darüber nachgedacht, aber es sieht für mich zu komplex aus, wenn Sie eine Transformation von ihnen benötigen, zB Standardwerte. Auf diese Weise möchte ich die Datei direkt auf localhost mit 'docker-compose ...' und remote mit 'make ...' und anderen Variablen verwenden können. –

Verwandte Themen