17 votes

Authentification Mongo dans Docker

J'essaie d'exécuter l'image docker mongo avec une authentification. En suivant l'exemple le plus simple de la documentation J'ai exécuté les images mongo et mongo-express par la commande docker-compose up commande. Mon docker-compose.yml à ce stade :

version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example

Cela fonctionne, les deux conteneurs démarrent correctement et je peux parcourir le contenu de mongo à partir du site web mongo-express. Cependant, chaque fois que je change le nom d'utilisateur ou le mot de passe dans le conteneur docker-compose.yml par exemple à ceci :

version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example123

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example123

le mongo-express jette un message d'erreur non authentifié :

mongo-express_1  | Admin Database connected
mongo-express_1  | { MongoError: Authentication failed.
mongo-express_1  |     at Function.MongoError.create (/node_modules/mongodb-core/lib/error.js:31:11)
mongo-express_1  |     at /node_modules/mongodb-core/lib/connection/pool.js:483:72
mongo-express_1  |     at authenticateStragglers (/node_modules/mongodb-core/lib/connection/pool.js:429:16)
mongo-express_1  |     at Connection.messageHandler (/node_modules/mongodb-core/lib/connection/pool.js:463:5)
mongo-express_1  |     at Socket.<anonymous> (/node_modules/mongodb-core/lib/connection/connection.js:319:22)
mongo-express_1  |     at emitOne (events.js:116:13)
mongo-express_1  |     at Socket.emit (events.js:211:7)
mongo-express_1  |     at addChunk (_stream_readable.js:263:12)
mongo-express_1  |     at readableAddChunk (_stream_readable.js:250:11)
mongo-express_1  |     at Socket.Readable.push (_stream_readable.js:208:10)
mongo-express_1  |   name: 'MongoError',
mongo-express_1  |   message: 'Authentication failed.',
mongo-express_1  |   ok: 0,
mongo-express_1  |   errmsg: 'Authentication failed.',
mongo-express_1  |   code: 18,
mongo-express_1  |   codeName: 'AuthenticationFailed' }
mongo-express_1  | unable to list databases
mongo-express_1  | { MongoError: command listDatabases requires authentication
mongo-express_1  |     at Function.MongoError.create (/node_modules/mongodb-core/lib/error.js:31:11)
mongo-express_1  |     at /node_modules/mongodb-core/lib/connection/pool.js:483:72
mongo-express_1  |     at authenticateStragglers (/node_modules/mongodb-core/lib/connection/pool.js:429:16)
mongo-express_1  |     at Connection.messageHandler (/node_modules/mongodb-core/lib/connection/pool.js:463:5)
mongo-express_1  |     at Socket.<anonymous> (/node_modules/mongodb-core/lib/connection/connection.js:319:22)
mongo-express_1  |     at emitOne (events.js:116:13)
mongo-express_1  |     at Socket.emit (events.js:211:7)
mongo-express_1  |     at addChunk (_stream_readable.js:263:12)
mongo-express_1  |     at readableAddChunk (_stream_readable.js:250:11)
mongo-express_1  |     at Socket.Readable.push (_stream_readable.js:208:10)
mongo-express_1  |   name: 'MongoError',
mongo-express_1  |   message: 'command listDatabases requires authentication',
mongo-express_1  |   ok: 0,
mongo-express_1  |   errmsg: 'command listDatabases requires authentication',
mongo-express_1  |   code: 13,
mongo-express_1  |   codeName: 'Unauthorized' }

Peu importe le nom d'utilisateur ou le mot de passe que j'entre dans le système. docker-compose.yml je n'arrive pas à faire en sorte que mongo-express se connecte à mongo, mais seulement si j'utilise l'interface originale root y example paire.

Notez que je ne récupère pas le nom d'utilisateur et le mot de passe en tant que variables d'environnement, mais qu'ils sont directement saisis dans le champ docker-compose.yml comme vous pouvez le voir ici.

Notez également que lorsque je change le MONGO_INITDB_ROOT_USERNAME y MONGO_INITDB_ROOT_PASSWORD (de mongo) à quoi que ce soit, elles ne semblent pas avoir d'effet, je peux toujours me connecter à mongo-express en utilisant les informations d'identification originales de Root et d'exemple.

Quelles sont les causes de ce comportement ? Comment puis-je le faire fonctionner ?

34voto

Jan Garaj Points 1999

Votre commande docker-compose :

docker-compose up --build --force-recreate    

Image Mongo utilise des volumes anonymes donc vous devez aussi --renew-anon-volumes ( doc ):

docker-compose up --build --force-recreate --renew-anon-volumes

Sinon, le volume précédent avec une base de données déjà initialisée est utilisé => les variables d'environnement INITDB ne seront pas utilisées.

2voto

user1507168 Points 21

Si vous créez le conteneur mongodb ( docker-compose up va construire/tirer l'image et démarrer un conteneur) en lui donnant le nom d'utilisateur et le mot de passe, mongodb se configurera lui-même lors de la première exécution et plus jamais ! Jusqu'à ce que vous créiez un nouveau conteneur pour ce service, l'utilisateur et le pass par défaut seront ceux définis initialement. Si vous voulez changer la valeur par défaut, un nouveau conteneur doit être créé. Vous pouvez également ajouter des utilisateurs après le démarrage du conteneur.

L'arrêt des conteneurs de services ( docker-compose stop ) ne détruira pas le conteneur. Pour ce faire, appelez docker-compose down ou, au démarrage, appelez docker-compose up --force-recreate .

Salutations

1voto

crg63 Points 121

Dans mon cas, j'ai dû d'abord

Arrêtez tous mes conteneurs

Puis docker system prune -a --volumes

C'est le dernier recours. S'il vous plaît, avant d'utiliser cette commande, vérifiez le document sur le docker ,

0voto

Hamza Hasbi Points 1

Le système docker prune -a --volumes peut résoudre le problème mais une façon beaucoup plus simple est (si vous montez un volume de données pour que la BD soit persistante) de supprimer et de recréer un nouveau volume de cette façon les autres volumes ne seront pas touchés. et bien sûr, combinez-la avec : docker-compose up --build --force-recreate --renew-anon-volumes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X