Можно ли изменить файл yml через скрипт оболочки?

12

Вот так выглядит мой 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'

Теперь мне нужно добавить контент через скрипт оболочки (на сервере Ubuntu). Я не совсем уверен, возможно ли это вообще:

  1. Добавить новый элемент nginx/links, если он не существует
  2. Добавить newthingблок, если новый блок отсутствует

Новый контент должен выглядеть так:

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'
user3142695
источник
1
Shell предоставляет вам очень мощный язык сценариев. Вы можете легко написать сценарий , используя sed, awkи regular expressionsобновить файл.
окаменелость
Не могли бы вы привести небольшой пример?
user3142695
2
Хотя это технически возможно при использовании shell, вам лучше использовать язык с реальной библиотекой yaml.
Иордания
Я бы посоветовал вам проверить ruamel.yamlбиблиотеку для Python.
PHK
Я думаю, что стоит отметить, что ссылки - это устаревшая функция, которая будет удалена из докера в будущем: docs.docker.com/compose/compose-file/#links
Микаэль Кьер

Ответы:

6

Существует множество библиотек yaml для Perl, Python и т. Д., Если это нормально, делать это не напрямую из сценария оболочки, а использовать другой язык.

Другой вариант - установить процессор yaml из командной строки и вызвать его из сценария оболочки.

dirkt
источник
8

Я написал https://github.com/kislyuk/yq , обертку вокруг https://stedolan.github.io/jq/ , для решения этого варианта использования.

ткачиха
источник
Это может сделать обновление?
Вейнхамз
1
Да: yq -y '.newthing=...' input.yml > output.yml. (Если вы спрашиваете об обновлении на месте, например sed -i, yq не может сделать это самостоятельно, но вы можете использовать sponge:. yq -y .newthing=... file.yml | sponge file.yml)
ткач
1
@ weaver ты мой новый герой
voutasaurus
7

Я написал yaml_cli ( https://github.com/Gallore/yaml_cli ), чтобы сделать именно то, что вам нужно. Он основан на питоне. Это будет синтаксис для вашего примера:

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

Отзывы о yaml_cli приветствуются.

Энди Вернер
источник
1

Поскольку причина, по которой вы хотите это сделать, заключается в изменении файла docker-compose, другой альтернативой является использование файла JSON. Docker-compose теперь поддерживает файлы JSON . Поддержка манипуляций с JSON в командной строке уже очень хорошая (например, jq )

Вивек Кодира
источник