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

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


person Eric    schedule 09.02.2017    source источник
comment
Вы уверены, что docker-compose уже поддерживает секреты? Какая docker-compose версия у вас установлена?   -  person fzgregor    schedule 09.02.2017
comment
$ docker-compose --version возвращает: docker-compose version 1.11.0, build 6de1806, так что да, он должен поддерживать секреты в соответствии с примечаниями к выпуску.   -  person Eric    schedule 09.02.2017
comment
поздно на вечеринку, но разве это не должно быть секретов: и не секрет:?   -  person Wellspring    schedule 31.07.2018


Ответы (6)


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

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

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

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

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

$ 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 может читать секреты либо из своей собственной базы данных (например, секреты, созданные с помощью 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/
root@secret_test_web:~$ cd /run/secrets/

root@secret_test_web:/run/secrets$ ls
my_external_secret  my_file_secret

root@secret_test_web:/run/secrets$ cat my_external_secret
This is an external secret

root@secret_test_web:/run/secrets$ cat my_file_secret
This is a file secret.

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

person Mike Hearn    schedule 10.02.2017
comment
Я получаю этот результат, когда запускаю первую указанную вами команду: Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again. Я запуталась! Нужно ли мне запускать рой, чтобы использовать docker-compose с секретами? - person Eric; 10.02.2017
comment
Ой, да, это так. Команда docker stack deploy является частью движка Swarm. Я добавлю строку на шаге 1, чтобы указать это. - person Mike Hearn; 10.02.2017
comment
Я не понимаю причины этого. Мой и многие другие варианты использования не требуют роя, но требуют секретов. Зачем заставлять нас использовать рой, если нам просто нужны секреты? - person Eric; 13.02.2017
comment
@Eric Если вам не нужен рой, вы можете просто смонтировать секретный файл со своей локальной машины. Зачем нужны секреты докеров? - person Vanuan; 15.02.2017
comment
@Vanuan, потому что мне нужны секреты для запуска контейнеров на моей удаленной машине, а не только на моей локальной машине. например, официальный образ owncloud содержит файл docker-compose.yml, который просит вас написать вниз пароль MySQL в качестве переменной среды, что является плохой практикой. Я думал, что секреты докеров решат это? - person Eric; 15.02.2017
comment
@ Эрик Да. Но секреты все равно нужно где-то хранить. В случае секретов докеров они хранятся в хранилище кластера. Если вы не используете кластер, вы можете просто создать файл и смонтировать его. Вам не нужна функция секретов докеров. - person Vanuan; 15.02.2017
comment
Хм, документация выглядит так, будто вы должны создать секрет из файла , точно так же, как вы создаете из простой строки, но, как показано здесь, секретный файл должен быть доступен команде stack deploy. Я что-то не понимаю в опции file? - person demaniak; 17.02.2017
comment
Нм, меня просто осенило: внешние секреты (файл или просто строка) похожи на внешние сети, а другой вариант позволяет команде развертывания создавать их на лету для стека, как сверхсеть, созданная по умолчанию. Ницца. - person demaniak; 17.02.2017
comment
Секреты можно использовать в docker-compose w / o swarm с 1.11, если вы используете файл не внешний, но обратите внимание, что они небезопасны, потому что compose не является производственным инструментом, и, как здесь сказано, нет места для их хранения в зашифрованном виде без рой плот db. Если вы правильно определите секреты на основе файлов в файле compose, docker-compose свяжет-монтирует файл в / run / secrets, чтобы имитировать то, что делает swarm, для упрощения рабочего процесса разработчика при локальной работе. Если вам нужно безопасное хранилище на сервере с одним узлом, вы можете запустить рой с одним узлом, и он отлично работает. - person Bret Fisher; 13.03.2017
comment
Поучительно запустить это с docker-compose, так как вы получите пару предупреждений о внешнем секрете. В контейнере вы можете увидеть файловый секрет в /run/secrets, но не внешний. - person Jamie Jackson; 27.09.2017
comment
@BretFisher: Что вы имеете в виду, говоря, что сочинение не является производственным инструментом? В документации docker есть раздел, посвященный использованию Compose в производственной среде, если кто-то использует один сервер. docs.docker.com/compose/production - person Kumar Saurabh; 21.05.2021

Если у вас есть служба 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 Swarm».

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

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

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

# 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 команд и выполняет их в терминале.

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

person Vanuan    schedule 10.02.2017
comment
docker secret create кажется требовать, чтобы существовал уже существующий рой? мне нужно создать его? - person Eric; 10.02.2017
comment
@Eric Так вы работаете как разработчик? Боюсь, что Docker пока не поддерживает этот вариант использования. Но да, вы можете создать рой докеров, состоящий только из вашей машины разработчика. Это выходит за рамки этого вопроса. - person Vanuan; 10.02.2017
comment
По состоянию на 8 февраля docker-compose 1.11 поддерживает файловые секреты при создании файлов для локального разработчика. См. Мой комментарий выше к выбранному ответу для подробностей :) - person Bret Fisher; 13.03.2017
comment
@BretFisher, но какой смысл, если это по сути то же самое, что указывать с помощью ./file_based_secret:/run/secrets/my_secret тома? - person Vanuan; 18.03.2017
comment
@Vanuan Верно, в контейнере нет функциональной разницы. Речь идет о бесшовном рабочем процессе и ограничении необходимости в нескольких файлах композиции. - person Bret Fisher; 18.03.2017

Вы также можете указать 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: Секреты

person nathanleclaire    schedule 04.04.2017
comment
Как определить несколько переменных в файле password? - person Jinna Balu; 05.05.2020

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

person sxn    schedule 09.02.2017
comment
да, это был точный отпечаток. Я попробовал вложить словарь secret в a (а также на том же уровне, что и services) и получил тот же результат. - person Eric; 09.02.2017

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

Посетите этот блог: https://www.docker.com/blog/docker-secrets-management/

И читайте комментарии: Большое спасибо за вводную статью. Упомянутые шаги для просмотра содержимого секретов в контейнере не будут работать, если контейнер redis создается на рабочем узле.

person Osama    schedule 06.07.2021
comment
Пожалуйста, поясните, как это отвечает на вопрос вверху страницы (вместо вопроса, заданного в комментариях). - person Yunnosch; 12.07.2021