web-dev-qa-db-fra.com

Comment créer un utilisateur dans mongodb avec docker-compose

J'essaie de créer une sorte de script qui créera un menu fixe avec mongodb et créera automatiquement un utilisateur.

Je peux généralement gérer mes images dans Docker avec Docker-Composer, mais cette fois-ci, je ne sais pas comment le faire.

En gros, voici ce que je dois faire:

  1. nettoyer/détruire le conteneur (docker-compose down)
  2. créez un conteneur docker avec mongodb et démarrez-le (sans --auth parameter
  3. exécuter un script Java contenant db.createUser()
  4. arrêter le conteneur
  5. redémarrez le même conteneur avec le paramètre --auth pour autoriser la connexion avec l'utilisateur créé dans le javascript

Je ne trouve pas comment faire cela correctement avec docker-compose, car quand il démarre, je dois lui donner la commande --auth. Si je le fais, je ne peux pas exécuter mon javascript pour ajouter mon utilisateur. MongoDB permet la création d'utilisateurs sans être connecté s'il n'y a pas d'utilisateur et si le paramètre --auth n'est pas fourni.

Je veux le faire automatiquement, je ne veux pas faire manuellement certaines commandes. L'objectif est de disposer d'un script pouvant être exécuté avant chaque test d'intégration pour démarrer à partir d'une base de données vierge.

Voici mon projet: 

integration-test/src/test/resources/scripts/docker-compose.yml

mongodb:
    container_name: mongo
    image: mongo
  ports:
    - "27017:27017"
  volumes:
    - .:/setup
  command: --auth

integration-test/src/test/resources/scripts/docker-init.sh

docker-compose down
docker-compose up -d
sleep 1
docker exec mongo bash -c "mongo myDatabase /setup/mongodb-setup.js"

integration-test/src/test/resources/scripts/mongodb-setup.js

db.createUser(
{
    user: "myUser",
    pwd: "myPassword",
    roles: [
      { role: "readWrite", db: "myDatabase" }
    ]
})

Trouver un moyen de redémarrer un conteneur avec un nouveau paramètre (dans ce cas, --auth) aiderait, mais je ne trouve pas comment le faire (le début du menu fixe ne prend pas de paramètres).

Une idée de comment je devrais faire ce que je voudrais? 

Sinon, je peux toujours tout supprimer de ma base de données avec du code Java ou autre chose, mais j'aimerais une configuration complète du docker mongodb créée avec un script.

22
jOHNdOE

EDIT: Le référentiel tutumcloud est obsolète et n'est plus maintenu. Voir les autres réponses.

Je vous suggère d'utiliser des variables d'environnement pour définir l'utilisateur mongo, la base de données et le mot de passe. tutum (propriété de Docker) a publié une très bonne image

https://github.com/tutumcloud/mongodb

docker run -d -p 27017:27017 -p 28017:28017 -e MONGODB_USER="user" -e MONGODB_DATABASE="mydatabase" -e MONGODB_PASS="mypass" tutum/mongodb

Vous pouvez convertir ces variables en variables d'environnement composées-composées. Vous n'avez pas à le coder en dur. 

environment:
    MONGODB_USER: "${db_user_env}"
    MONGODB_DATABASE: "${dbname_env}"
    MONGODB_PASS: "${db_pass}"

Cette configuration lira les variables d'environnement de votre session.

12
timchunght

L’image mongo officielle prend désormais en charge les variables d’environnement suivantes qui peuvent être utilisées dans docker-compose comme ci-dessous:

environment:
      - MONGO_INITDB_ROOT_USERNAME=user
      - MONGO_INITDB_ROOT_PASSWORD=password
      - MONGO_INITDB_DATABASE=test

plus d'explications sur: https://stackoverflow.com/a/42917632/1069610

19
jzqa

C’est comme cela que je le fais. Mon objectif était d’amener quelques conteneurs avec mongodb, les autres conteneurs s’attendant à ce qu’un utilisateur soit présent lorsqu’ils se présentent, cela a fonctionné pour moi. La bonne partie est que mongoClientTemp se ferme une fois la commande exécutée afin que le conteneur ne reste pas. 

version: '2'
services:
  mongo:
   image: mongo:latest
   container_name: mongo
   ports:
    - "27017:27017"
   volumes:
    - /app/hdp/mongo/data:/data/db

  mongoClientTemp:
   image: mongo:latest
   container_name: mongoClientTemp
   links:
    - mongo:mongo
   command: mongo --Host mongo --eval  "db.getSiblingDB('dashboard').createUser({user:'db', pwd:'dbpass', roles:[{role:'readWrite',db:'dashboard'}]});"
   depends_on:
    - mongo

  another-container:
   image: another-image:v01
   container_name: another-container
   ports:
    - "8080:8080"
   volumes:
    - ./logs:/app/logs
   environment:
    - MONGODB_Host=mongo
    - MONGODB_PORT=27017
   links:
    - mongo:mongo
   depends_on:
    - mongoClientTemp
12
GreenThumb

fichier: docker-compose.yaml

mongo:
    image: mongo:latest
    volumes_from:
        - data
    ports:
        - "27017:27017"
    command: --auth

    container_name: "db_mongodb"

data:
    image: mongo:latest
    volumes:
        - /var/lib/mongo
        - ./setup:/setup
    command: "true"
    container_name: "db_mongodb_data"

fichier: .buildMongo.sh

#!/bin/sh
docker-compose down
docker-compose up -d
sleep 1
docker exec db_mongodb  mongo admin /setup/create-admin.js
docker exec db_mongodb  mongo myDb /setup/create-user.js -u admin -p admin --authenticationDatabase admin

Les fichiers create-admin.js et create-user.js sont des commandes que vous utilisez à l'aide du shell mongo. Ils doivent donc être faciles à comprendre pour vous. La vraie direction est comme la réponse jzqa, "variables d'environnement" . La question ici est donc de savoir comment créer un utilisateur. Je pense que cela répond au moins à ce point, vous pouvez vérifier la configuration complète ici https://github.com/Lus1t4nUm/mongo_docker_bootstrap

1
ANormalUser

Après avoir lu la page du docker mongo officielle, j'ai découvert que vous pouvez créer un utilisateur administrateur une seule fois, même si l'option auth est utilisée. Ceci n’est pas bien documenté, mais cela fonctionne simplement (espérons que ce n’est pas une fonctionnalité)… .. Par conséquent, vous pouvez continuer à utiliser l’option auth tout le temps.

J'ai créé un référentiel github avec des scripts encapsulant les commandes à utiliser. Les lignes de commande les plus importantes à exécuter sont:

docker exec db_mongodb mongo admin /setup/create-admin.js
docker exec db_mongodb mongo admin /setup/create-user.js -u admin -p admin --authenticationDatabase admin

La première ligne créera l'utilisateur admin (et mongo ne se plaindra pas, même avec l'option auth). La deuxième ligne créera votre utilisateur "normal", en utilisant les droits d'administrateur du premier.

0