comment gérer les valeurs secrètes avec docker-composez v3.1?
la Version 3.1 du docker-composer.la spécification yml introduit la prise en charge de secrets.
j'ai essayé ceci:
version: '3.1'
services:
a:
image: tutum/hello-world
secret:
password: the_password
b:
image: tutum/hello-world
$ docker-compose up
renvoie:
Unsupported config option for services.secret: 'password'
Comment Pouvons-nous utiliser la fonctionnalité secrets dans la pratique?
5 réponses
Vous pouvez lire les section correspondante de la documentation officielle.
utilisation De secrets, vous devez ajouter deux choses dans votre docker-compose.yml
fichier. Tout d'abord, un premier niveau secrets:
bloc qui définit tous les secrets. Ensuite, un autre secrets:
bloc sous chaque service qui spécifie les secrets que le service devrait recevoir.
à titre d'exemple, créez les deux types de secrets que Docker comprendra: externe secrets et le fichier secrets.
1. Créer un secret "externe" en utilisant docker secret create
Première chose: secrets d'utilisation avec menu fixe, le nœud doit être partie d'un essaim.
$ docker swarm init
Ensuite, créer un "alias" secret:
$ echo "This is an external secret" | docker secret create my_external_secret -
(assurez-vous d'inclure le dernier tiret, -
. Il est facile de rater.)
2. Écrire un autre secret dans un fichier
$ echo "This is a file secret." > my_file_secret.txt
3. Créer un docker-compose.yml
le fichier qui utilise les deux secrets
Maintenant que les deux types de secrets sont créés, voici le docker-compose.yml
fichier qui lira les deux et les écrira à web
service:
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 peut lire des secrets soit à partir de sa propre base de données (par exemple des secrets fabriqués avec docker secret create
) ou à partir d'un fichier. Ce qui précède montre les deux exemples.
4. Déployez votre pile de test
déployer la pile en utilisant:
$ docker stack deploy --compose-file=docker-compose.yml secret_test
cela créera une instance de web
service, nommé secret_test_web
.
5. Vérifiez que le conteneur créé par le service a deux secrets
Utiliser docker exec -ti [container] /bin/sh
pour vérifier que les secrets existent.
(Note: en dessous de docker exec
la commande, le m2jgac...
la portion sera différente sur votre machine. Exécutez docker ps
pour trouver le nom de votre conteneur.)
$ 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.
si tout va bien, les deux secrets que nous avons créés aux étapes 1 et 2 devraient être à l'intérieur du web
conteneur qui a été créé lorsque nous déployé notre stack.
etant Donné que vous avez un service myapp
et un fichier Secret secrets.yml
:
Créer un fichier composer:
version: '3.1'
services:
myapp:
build: .
secrets:
secrets_yaml
Disposition un secret à l'aide de cette commande:
docker secret create secrets_yaml secrets.yml
déployez votre service en utilisant cette commande:
docker deploy --compose-file docker-compose.yml myappstack
Maintenant, votre application peut accéder au dossier secret /run/secrets/secrets_yaml
. Vous pouvez soit hardcode ce chemin dans votre application ou créer un lien symbolique.
Les différents question
cette réponse est probablement à la question "Comment Fournissez-vous vos secrets à votre amas d'essaims docker".
la question originale "comment gérer les valeurs secrètes avec docker composer" implique que le fichier docker-composer contient des valeurs secrètes. Il ne le fait pas.
il y a une autre question: "Où stockez-vous la source canonique du secrets.yml
le fichier". C'est à vous de voir. Vous pouvez les stocker dans votre tête, imprimer sur une feuille de papier, utilisez un gestionnaire de mots de passe, utilisez une application/base de données dédiée aux secrets. Vous pouvez même utiliser un dépôt git s'il est sécurisé. Bien sûr, ne le stockez jamais dans le système que vous sécurisez avec:)
je recommanderais chambre forte. Pour stocker un secret:
# create a temporary secret file
cat secrets.yml | vault write secret/myappsecrets -
pour récupérer un secret et le mettre dans votre essaim docker:
vault read -field=value secret/myappsecrets | docker secret create secrets_yaml -
bien sûr, vous pouvez utiliser Docker cluster lui-même comme une seule source de vérité pour vous secrets, mais si votre amas de dockers casse, vous avez perdu vos secrets. Donc, assurez-vous d'avoir une sauvegarde ailleurs.
La question posée personne
la troisième question (que personne n'a posée) est de savoir comment fournir des secrets aux machines des développeurs. Elle peut être nécessaire lorsqu'il y a un service externe qui est impossible à simuler localement ou une grande base de données qui est impossible à copier.
encore une fois, docker n'a rien à voir avec ça (encore.) Il n'a pas de listes de contrôle d'accès qui précisent quels développeurs ont accès à quels secrets. Il n'a aucun mécanisme d'authentification.
La solution idéale semble être ceci:
- un développeur ouvre une application web.
- S'authentifie à l'aide d'un mécanisme de connexion unique.
- copie une longue liste de
docker secret create
commandes et les exécute dans le terminal.
nous devons encore voir si tel une application apparaît.
vous pouvez aussi spécifier secrets
stocké localement dans un fichier en utilisant file:
secrets
objet. Ensuite, vous n'avez pas à docker secret create
vous-même, Composer / docker stack deploy
va le faire pour vous.
version: '3.1'
secrets:
password:
file: ./password
services:
password_consumer:
image: alpine
secrets:
- password
Référence: composer file version 3 référence: Secrets
Est-ce l'indentation exacte de votre docker-compose.yml
fichier? J' pensersecret
secrets
devrait être imbriqué sous a
(c'est à dire l'un des services), ne relevant pas directement de services
section.