Czy można zmodyfikować plik yml za pomocą skryptu powłoki?

12

Tak wygląda mój 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'

Teraz muszę dodać trochę treści za pomocą skryptu powłoki (na serwerze Ubuntu). Nie jestem do końca pewien, czy jest to w ogóle możliwe:

  1. Dodaj nowy element nginx/links, jeśli nie istnieje
  2. Dołącz newthingblok, jeśli nie istnieje blok niczego

Nowa treść powinna wyglądać następująco:

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'
użytkownik3142695
źródło
1
Shell zapewnia bardzo wydajny język skryptowy. Można łatwo napisać skrypt, za pomocą sed, awki regular expressionsaby zaktualizować plik.
skamielina
Czy możesz podać mały przykład?
user3142695,
2
Chociaż jest to technicznie możliwe przy użyciu powłoki, lepiej jest użyć języka, który ma rzeczywistą bibliotekę yaml.
jordanm
Radzę sprawdzić ruamel.yamlbibliotekę Python.
phk
Myślę, że warto zauważyć, że linki to starsza funkcja, która zostanie usunięta z dokera w przyszłości: docs.docker.com/compose/compose-file/#links
Mikael Kjær

Odpowiedzi:

6

Istnieje wiele bibliotek yaml dla Perla, Pythona itp., Jeśli można to zrobić nie bezpośrednio ze skryptu powłoki, ale użyć innego języka.

Inną opcją jest zainstalowanie procesora yaml z wiersza poleceń i wywołanie go ze skryptu powłoki.

reż
źródło
8

Napisałem https://github.com/kislyuk/yq , opakowanie wokół https://stedolan.github.io/jq/ , aby rozwiązać ten przypadek użycia.

tkacz
źródło
Czy można to zaktualizować?
weynhamz,
1
Tak: yq -y '.newthing=...' input.yml > output.yml. (Jeśli proszą o aktualizacji w miejscu, jak sed -i, yq nie może zrobić to samo w sobie jeszcze, ale można użyć sponge: yq -y .newthing=... file.yml | sponge file.yml.)
tkacz
1
@ tkacz jesteś moim nowym bohaterem
voutasaurus
7

Napisałem yaml_cli ( https://github.com/Gallore/yaml_cli ), aby zrobić dokładnie to, czego potrzebujesz. Opiera się na pythonie. Oto przykładowa składnia:

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

Dziękujemy za opinię na temat yaml_cli.

Andy Werner
źródło
1

Ponieważ powód, dla którego chcesz to zrobić, to zmodyfikować plik komponujący okno dokowane, inną alternatywą jest użycie pliku JSON. Docker-compose obsługuje teraz pliki JSON . Obsługa manipulacji JSON w wierszu polecenia jest już bardzo dobra (np .: jq )

Vivek Kodira
źródło