⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

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 variables db_password et db_root_password et fournit le file 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

Les variables d'environnement _FILE démontrées ici sont une convention utilisée par certaines images, y compris les Images Officielles Docker comme mysql et postgres.

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

Ressources