Comment utiliser les secrets dans Docker Compose
Un secret est toute donnée, comme un mot de passe, un certificat ou une clé API, qui ne devrait pas être transmise sur un réseau ou stockée non chiffrée dans un Dockerfile ou dans le code source de votre application.
Docker Compose vous permet d'utiliser des secrets sans avoir à utiliser de variables d'environnement pour stocker des informations. Si vous injectez des mots de passe et des clés API en tant que variables d'environnement, vous risquez une exposition involontaire d'informations. Les services ne peuvent accéder aux secrets que lorsqu'ils sont explicitement accordés par un attribut secrets
dans l'élément de niveau supérieur services
.
Les variables d'environnement sont souvent disponibles pour tous les processus, et il peut être difficile de suivre l'accès. Elles peuvent également être affichées dans les journaux lors du débogage d'erreurs sans que vous le sachiez. L'utilisation de secrets atténue ces risques.
Utiliser les secrets
Les secrets sont montés en tant que fichier dans /run/secrets/<nom_secret>
à l'intérieur du conteneur.
Faire entrer un secret dans un conteneur est un processus en deux étapes. Premièrement, définissez le secret en utilisant l' élément secrets de niveau supérieur dans votre fichier Compose. Ensuite, mettez à jour vos définitions de service pour référencer les secrets dont ils ont besoin avec l' attribut secrets. Compose accorde l'accès aux secrets service par service.
Contrairement aux autres méthodes, cela permet un contrôle d'accès granulaire au sein d'un conteneur de service via les permissions standard du système de fichiers.
Exemples
Simple
Dans l'exemple suivant, le service frontend a accès au secret my_secret
. Dans le conteneur, /run/secrets/my_secret
est défini au contenu du fichier ./my_secret.txt
.
services:
myapp:
image: myapp:latest
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
Avancé
services:
db:
image: mysql:latest
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_root_password
- db_password
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: db_password.txt
db_root_password:
file: db_root_password.txt
volumes:
db_data:
Dans l'exemple avancé ci-dessus :
- L'attribut
secrets
sous chaque service définit les secrets que vous voulez injecter dans le conteneur spécifique. - La section
secrets
de niveau supérieur définit les variablesdb_password
etdb_root_password
et fournit lefile
qui remplit leurs valeurs. - Le déploiement de chaque conteneur signifie que Docker crée un montage de système de fichiers temporaire sous
/run/secrets/<nom_secret>
avec leurs valeurs spécifiques.
Note
Secrets de construction
Dans l'exemple suivant, le secret npm_token
est rendu disponible au moment de la construction. Sa valeur est prise de la variable d'environnement NPM_TOKEN
.
services:
myapp:
build:
secrets:
- npm_token
context: .
secrets:
npm_token:
environment: NPM_TOKEN