2016-05-18 4 views
4
web: 
    image: nginx 
    volumes: 
    - "./app:/src/app" 
    ports: 
    - "3030:3000" 
    - "35729:35729" 

Ich möchte ein Bash-Skript, um die nginx für ein Argument mit Bash-Skript zu ersetzen.Ersetzen Sie den Wert einer Zeile in einem Yml mit Bash

./script apache 

ersetzt nginx für apache

+1

Da es so aussieht, als würden Sie den Wert in einer docker-compose-Datei überschreiben wollen, sollten Sie sich meinen Docker [compose wrapper program] (https://pypi.python.org/pypi/ruamel.dcw) ansehen, der dies ermöglicht Standard, der durch Umgebungsvariablen überschrieben werden kann (z. B. um einen Unterschied zwischen einem Test- und einem Produktivsystem zu machen). Da es YAML 1.2 unterstützt, entlastet es Sie auch von der Notwendigkeit, Port-Mappings "3030: 3000" zu zitieren, die von compose's Standard YAML 1.1 Parser als Sexagesimale interpretiert werden könnten – Anthon

Antwort

5

können Sie verwenden: sed -r 's/^(\s*)(image\s*:\s*nginx\s*$)/\1image: apache/' file

Probelauf:

$ cat file 
web: 
    image: nginx 
    volumes: 
    - "./app:/src/app" 
    ports: 
    - "3030:3000" 
    - "35729:35729" 
$ sed -r 's/^(\s*)(image\s*:\s*nginx\s*$)/\1image: apache/' file 
web: 
    image: apache 
    volumes: 
    - "./app:/src/app" 
    ports: 
    - "3030:3000" 
    - "35729:35729" 

Um die Änderungen in die Datei bestehen können Sie verwenden in-place-Option so:

$ sed -ri 's/^(\s*)(image\s*:\s*nginx\s*$)/\1image: apache/' file 

Wenn Sie es in einem Skript möchten, können Sie den sed Befehl in einem Skript gerade auf und führen Sie es mit $1 in sustitution.

$ vim script.sh 
$ cat script.sh 
sed -ri 's/^(\s*)(image\s*:\s*nginx\s*$)/\1image: '"$1"'/' file 
$ chmod 755 script.sh 
$ cat file 
web: 
    image: nginx 
    volumes: 
    - "./app:/src/app" 
    ports: 
    - "3030:3000" 
    - "35729:35729" 
$ ./script.sh apache 
$ cat file 
web: 
    image: apache 
    volumes: 
    - "./app:/src/app" 
    ports: 
    - "3030:3000" 
    - "35729:35729" 
$ 
3

Skript:

#!/bin/bash 
sed -i.bak "s/\bnginx\b/$1/g" file 
# \b matches for word boundary 
# -i changes the file in-place 
# -i.bak produces a backup with .bak extension 

Jetzt können Sie ./script apache tun nginx mit Apache zu ersetzen.

0

da dies anscheinend eine Docker-compose Datei, möchten Sie vielleicht

image: ${webserver_image} 

und dann eingestellt, um zu versuchen:

webserver_image=[nginx | apache] 

vor dem Start. Ich glaube, das sollte dir eine schöne Interpolation geben.