Как вы управляете секретными значениями с помощью 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'
Как мы можем использовать функцию секретов на практике?
Ответы
Ответ 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
.