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:
docker-compose down
)--auth parameter
) db.createUser()
--auth
pour autoriser la connexion avec l'utilisateur créé dans le javascriptJe 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.
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.
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
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
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
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.