Чи можна змінити файл 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'

1
Shell надає вам дуже потужну мову сценаріїв. Ви можете легко написати сценарій , використовуючи sed, awkі regular expressionsоновити файл.
скам’янілий

Чи можете ви надати трохи приклад?
користувач3142695

2
Хоча технічно це можливо за допомогою оболонки, вам краще використовувати мову, яка має фактичну бібліотеку ямлів.
Йорданм

Я б радив вам перевірити ruamel.yamlбібліотеку для Python.
phk

Я думаю, що варто відзначити, що посилання - це застаріла функція, яку в майбутньому буде видалено з docker
Mikael Kjær

Відповіді:


6

Існує кілька бібліотек yaml для Perl, Python тощо, якщо це нормально робити це не безпосередньо зі скрипту оболонки, а використовувати іншу мову.

Інший варіант - встановити процесор yaml командного рядка та викликати його зі свого сценарію оболонки.


8

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


Чи можна зробити оновлення?
weynhamz

1
Так: yq -y '.newthing=...' input.yml > output.yml. (Якщо ви запитуєте про оновлення на місці, наприклад sed -i, yq ще не може зробити це самостійно, але ви можете використовувати sponge:. yq -y .newthing=... file.yml | sponge file.yml)
ткач

1
@weaver ти мій новий герой
вутазавр

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.