La version 3.1 de la spécification docker-compose.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é de secrets dans la pratique?
Vous pouvez lire le section correspondante de la documentation officielle .
Pour utiliser les secrets, vous devez ajouter deux éléments dans votre fichier docker-compose.yml
. Premièrement, un bloc secrets:
de niveau supérieur qui définit tous les secrets. Ensuite, un autre bloc secrets:
_ sous chaque service spécifie quels secrets le service doit recevoir.
Par exemple, créez les deux types de secrets que Docker comprendra: externe et fichier secrets.
docker secret create
Première chose: pour utiliser les secrets avec Docker, le nœud sur lequel vous vous trouvez doit faire partie d'un essaim.
$ docker swarm init
Ensuite, créez un secret "externe":
$ echo "This is an external secret" | docker secret create my_external_secret -
(Assurez-vous d'inclure le dernier tiret, -
. C'est facile à manquer.)
$ echo "This is a file secret." > my_file_secret.txt
docker-compose.yml
qui utilise les deux secretsMaintenant que les deux types de secrets sont créés, voici le fichier docker-compose.yml
qui les lira et les écrira dans le service 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 peut lire les secrets à partir de sa propre base de données (par exemple, secrets créés avec docker secret create
) ou à partir d'un fichier. Ce qui précède montre les deux exemples.
Déployez la pile en utilisant:
$ docker stack deploy --compose-file=docker-compose.yml secret_test
Cela créera une instance du service web
, nommée secret_test_web
.
Utilisez docker exec -ti [container] /bin/sh
pour vérifier que les secrets existent.
(Remarque: dans la commande docker exec
ci-dessous, la partie m2jgac...
sera différente sur votre ordinateur. 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 doivent se trouver dans le conteneur web
créé lors du déploiement de notre pile.
Étant donné que vous avez un service myapp
et un fichier de secrets secrets.yml
:
Créez un fichier de composition:
version: '3.1'
services:
myapp:
build: .
secrets:
secrets_yaml
Fournissez 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
Votre application peut maintenant accéder au fichier secret à l'adresse /run/secrets/secrets_yaml
. Vous pouvez coder en dur ce chemin dans votre application ou créer un lien symbolique.
La question différente
Cette réponse est probablement à la question "comment approvisionner vos secrets à votre groupe d'essaims de docker".
La question initiale "Comment gérez-vous les valeurs secrètes avec Docker Compose" implique que le fichier docker-compose contient des valeurs secrètes. Ce n'est pas.
La question est différente: "Où stockez-vous la source canonique du fichier secrets.yml
"? C'est toi qui vois. Vous pouvez le stocker dans votre tête, imprimer sur une feuille de papier, utiliser un gestionnaire de mots de passe, utiliser une application/base de données secrète. Heck, vous pouvez même utiliser un référentiel git s'il est sécurisé en toute sécurité. Bien sûr, ne le stockez jamais dans le système que vous sécurisez avec celui-ci :)
Je recommanderais Coffre-fort . 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 nuée de dockers:
vault read -field=value secret/myappsecrets | docker secret create secrets_yaml -
Bien sûr, vous pouvez utiliser le cluster Docker lui-même comme source unique de vérité pour vos secrets, mais si votre cluster Docker se cassait, vous auriez perdu vos secrets. Assurez-vous donc d'avoir une sauvegarde ailleurs.
La question que personne n'a posée
La troisième question (que personne n’a posée) est de savoir comment fournir des secrets aux machines des développeurs. Cela peut s'avérer utile lorsqu'il existe un service externe impossible à simuler localement ou une base de données volumineuse impossible à copier.
Encore une fois, docker n'a rien à voir avec cela (pour l'instant). Il n'a pas de listes de contrôle d'accès qui spécifient quels développeurs ont accès à quels secrets. Il n'a pas non plus de mécanisme d'authentification.
La solution idéale semble être la suivante:
docker secret create
et les exécute dans le terminal.Nous n'avons pas encore vu si une telle application apparaît.
Vous pouvez également spécifier secrets
stocké localement dans un fichier à l'aide de la touche file:
dans l'objet secrets
. Alors vous n'êtes pas obligé de docker secret create
les composer vous-même, Compose/docker stack deploy
le fera pour vous.
version: '3.1'
secrets:
password:
file: ./password
services:
password_consumer:
image: Alpine
secrets:
- password
Référence: référence de la version 3 du fichier Compose: Secrets
Je suppose que le mot clé est secrets
pas secret
. C’est au moins ce que j’ai compris à la lecture du schéma .
S'agit-il de l'indentation exacte de votre fichier docker-compose.yml
? Je pense secret
secrets
doit être imbriqué sous a
(c'est-à-dire un des services) et non directement sous services
section.