Есть ли способ использовать поля расширения в docker-compose с секретами docker? - PullRequest
0 голосов
/ 06 февраля 2019

Давайте представим, что у нас есть стек докера, который настраивается с помощью файла .yml с 3 сервисами - a, b и c.Также есть множество секретов, которые используют эти сервисы.Два для базы данных, службы Azure и несколько уникальных для каждой службы.Итак, наш файл .yml выглядит так:

version: '3.4'

services:
 a:
  image: a-image
  [...]
  secrets:
   -db.pwd
   -db.user
   -azure.secret_key
   -azure.public_key
   -a.secret_key1
   -a.secret_key2
 b:
  image: b-image
  [...]
  secrets:
   -db.pwd
   -db.user
   -b.secret_key1
   -b.secret_key2
 c:
  image: c-image
  [...]
  secrets:
   -db.pwd
   -db.user
   -azure.secret_key
   -azure.public_key
   -c.secret_key1
   -c.secret_key2

secrets:
 db.pwd:
  external: true
 db.user:
  external: true
 azure.secret_key:
  external: true
 azure.public_key:
  external: true
 a.secret_key1:
  external: true
 a.secret_key2:
  external: true
 b.secret_key1:
  external: true
 b.secret_key2:
  external: true
 c.secret_key1:
  external: true
 c.secret_key2:
  external: true

Как видите, некоторые секреты повторяются в каждом сервисе.В файле docker-compose есть такая вещь, как «Поля расширения» - https://docs.docker.com/compose/compose-file/#extension-fields Можно ли как-нибудь использовать эти поля расширения, чтобы избежать повторения секретов?Примерно так:

version: '3.4'
x-common-db-secrets: &db-secrets
 - db.user
 - db.pwd

x-common-azure-secrets: &azure-secrets
 - azure.public_key
 - azure.secret_key

services:
 a:
  image: a-image
  [...]
  secrets:
   <<: *db-secrets
   <<: *azure-secrets
   -a.secret_key1
   -a.secret_key2
 b:
  image: b-image
  [...]
  secrets:
   <<: *db-secrets
   -b.secret_key1
   -b.secret_key2
 c:
  image: c-image
  [...]
  secrets:
   <<: *db-secrets
   <<: *azure-secrets
   -c.secret_key1
   -c.secret_key2

secrets:
 [...]

Я использую поля этого расширения для такого способа совместного использования переменных среды.Но структура, необходимая для разбора полей расширения - это map.А раздел «Секреты» требует списка.У кого-нибудь есть идеи, как правильно с этим справиться? Обратите внимание, что в будущем могут быть добавлены новые секреты, которые будут использоваться, например, в старых и новых сервисах, поэтому решение должно быть гибким.Я буду очень признателен, чтобы найти ответ.Ищу ответ для любого сочинения версии 3.4 +.

1 Ответ

0 голосов
/ 06 февраля 2019

Невозможно использовать якоря и псевдонимы YAML для объединения элементов списка в один плоский список.Однако в docker-compose есть собственный процесс глубокого объединения файлов Compose, который вы можете комбинировать с якорями и псевдонимами YAML, чтобы получить нужный эффект.Для этого вам нужно разделить определения служб на два файла.Вот пример

foo.yml

Этот файл Compose имеет расширение с именем x-secrets, которое объявляет секреты с именами one и two.У него есть якорь с именем secrets, и он используется для заполнения общих секретов служб a и b.

version: "3.7"

x-secrets: &secrets
  secrets:
    - one
    - two

services:
  a:
    <<: *secrets
    image: a-image

  b:
    <<: *secrets
    image: b-image

secrets:
  one:
    external: true
  two:
    external: true

bar.yml

ДалееФайл компоновки расширяет службу a двумя дополнительными секретами с именами three и four.

version: "3.7"

services:
  a:
    secrets:
      - three
      - four

secrets:
  three:
    external: true
  four:
    external: true

Объединение файлов компоновки

Когда два файла на месте, скажите docker-составить, чтобы использовать их обоих для конфигурации проекта.Файлы будут объединены - для того, чтобы сформировать одну полную конфигурацию.Я использую команду config, чтобы показать окончательную конфигурацию.

$ docker-compose -f foo.yml -f bar.yml config
secrets:
  four:
    external: true
    name: four
  one:
    external: true
    name: one
  three:
    external: true
    name: three
  two:
    external: true
    name: two
services:
  a:
    image: a-image
    secrets:
    - source: four
    - source: one
    - source: three
    - source: two
  b:
    image: b-image
    secrets:
    - source: one
    - source: two
version: '3.7'

Здесь вы можете видеть, что служба a теперь имеет четыре секрета.Списки секретов из foo.yml и bar.yml были объединены вместе.

Кроме того, вы можете указать список файлов Compose, используя переменную среды с именем COMPOSE_FILE, которую также можно поместить вфайл с именем .env.

...