Подтвердить что ты не робот

Как вы управляете секретными значениями с помощью docker-compose v3.1?

Версия 3.1 спецификации docker-compose.yml вводит поддержку секретов.

Я пробовал это:

version: '3.1'

services:
  a: 
    image: tutum/hello-world
  secret: 
    password: the_password
  b:
    image: tutum/hello-world

$ docker-compose up возвращает:

Unsupported config option for services.secret: 'password'

Как мы можем использовать функцию секретов на практике?

4b9b3361

Ответ 1

Вы можете прочитать соответствующий раздел из официальной документации.

Чтобы использовать секреты, вам нужно добавить две вещи в ваш файл docker-compose.yml. Во-первых, блок верхнего уровня secrets:, который определяет все секреты. Затем другой блок secrets: под каждой службой, который указывает, какие секреты должен получать служба.

В качестве примера создайте два типа секретов, которые поймут Докер: внешние секреты и файл секреты.

1. Создайте "внешний" секрет с помощью docker secret create

Первое: использовать секреты с Docker, node, на котором вы находитесь, должно быть частью рой.

$ docker swarm init

Затем создайте "внешний" секрет:

$ echo "This is an external secret" | docker secret create my_external_secret -

(Убедитесь, что вы включили финальную тире, -. Легко пропустить.)

2. Напишите еще один секрет в файл

$ echo "This is a file secret." > my_file_secret.txt

3. Создайте файл docker-compose.yml, в котором используются обе секреты

Теперь, когда создаются оба типа секретов, вот файл docker-compose.yml, который будет читать оба этих файла и записывать их в службу web:

version: '3.1'

services:
  web:
    image: nginxdemos/hello
    secrets:                    # secrets block only for 'web' service
     - my_external_secret
     - my_file_secret

secrets:                        # top level secrets block
  my_external_secret:
    external: true
  my_file_secret:
    file: my_file_secret.txt

Докер может читать секреты либо из своей собственной базы данных (например, секреты, сделанные с помощью docker secret create), либо из файла. Вышеприведенное показывает оба примера.

4. Разверните тестовый стек

Разверните стек, используя:

$ docker stack deploy --compose-file=docker-compose.yml secret_test

Это создаст один экземпляр службы web с именем secret_test_web.

5. Убедитесь, что контейнер, созданный службой, имеет как секреты

Используйте docker exec -ti [container] /bin/sh, чтобы убедиться, что существуют секреты.

(Примечание: в приведенной ниже команде docker exec часть m2jgac... будет отличаться на вашем компьютере. Запустите docker ps, чтобы найти имя вашего контейнера.)

$ docker exec -ti secret_test_web.1.m2jgacogzsiaqhgq1z0yrwekd /bin/sh

# Now inside secret_test_web; secrets are contained in /run/secrets/
[email protected]_test_web:~$ cd /run/secrets/

[email protected]_test_web:/run/secrets$ ls
my_external_secret  my_file_secret

[email protected]_test_web:/run/secrets$ cat my_external_secret
This is an external secret

[email protected]_test_web:/run/secrets$ cat my_file_secret
This is a file secret.

Если все хорошо, обе секреты, которые мы создали на шагах 1 и 2, должны быть внутри контейнера web, который был создан при развертывании нашего стека.

Ответ 2

Учитывая, что у вас есть служба myapp и файл секретов secrets.yml:

Создайте файл компоновки:

version: '3.1'

services:
  myapp:
    build: .
    secrets:
      secrets_yaml

Предоставьте секрет, используя следующую команду:

docker secret create secrets_yaml secrets.yml

Разверните службу, используя следующую команду:

docker deploy --compose-file docker-compose.yml myappstack

Теперь ваше приложение может получить доступ к секретному файлу в /run/secrets/secrets_yaml. Вы можете либо жестко указать этот путь в своем приложении, либо создать символическую ссылку.


Другой вопрос

Этот ответ, вероятно, связан с вопросом: "Как вы предоставляете свои секреты вашему клану докеров?".

Первоначальный вопрос "как управлять секретными значениями с помощью docker compose" означает, что файл docker-compose содержит секретные значения. Это не так.

Здесь возникает другой вопрос: "Где вы храните канонический источник файла secrets.yml". Это зависит от вас. Вы можете сохранить его в своей голове, распечатать на листе бумаги, использовать диспетчер паролей, использовать специальное приложение/базу данных. Черт, вы можете даже использовать репозиторий git, если он безопасно защищен сам. Конечно, никогда не храните его в системе, которую вы обеспечиваете с ней:)

Я бы порекомендовал vault. Чтобы сохранить секрет:

# create a temporary secret file
cat secrets.yml | vault write secret/myappsecrets -

Чтобы получить секрет и поместить его в рой докеров:

vault read -field=value secret/myappsecrets | docker secret create secrets_yaml -

Конечно, вы можете использовать кластер докеров как единственный источник правды для ваших секретов, но если ваш клан докеров разорвется, вы потеряете свои секреты. Поэтому убедитесь, что у вас есть резервная копия в другом месте.


Вопрос, который никто не задавал

Третий вопрос (который никто не спрашивал) заключается в том, как предоставлять секреты машинам разработчиков. Это может потребоваться, если есть внешняя служба, которую невозможно издеваться локально или большая база данных, которую невозможно скопировать.

Опять же, докер не имеет к этому никакого отношения (пока). В нем нет списков контроля доступа, в которых указывается, какие разработчики имеют доступ к секретам. Он также не имеет механизма аутентификации.

Идеальное решение выглядит следующим образом:

  • Разработчик открывает некоторое веб-приложение.
  • Аутентификация с использованием какого-либо механизма с одним знаком.
  • Копирует некоторый длинный список команд docker secret create и выполняет их в терминале.

Нам еще нужно выяснить, всплывает ли такое приложение.

Ответ 3

Вы также можете указать secrets, хранящийся локально в файле, с помощью клавиши file: в объекте secrets. Тогда вам не нужно их docker secret create, Compose/docker stack deploy сделает это за вас.

version: '3.1'

secrets:
  password:
    file: ./password

services:
  password_consumer:
    image: alpine
    secrets:
      - password

Ссылка: Создать ссылку на версию файла 3: Секреты

Ответ 4

Я думаю, что ключевое слово secrets not secret. Это, по крайней мере, то, что я понимаю из чтения schema.

Ответ 5

Это точный отступ вашего файла docker-compose.yml? Я думаю, что secret secrets должен быть вложен под a (т.е. Одна из служб), а не непосредственно в разделе services.