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'

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.



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.


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 )

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.