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.