it-swarm.com.de

So erstellen Sie Benutzer in Mongodb mit Docker-Compose

Ich versuche, eine Art Skript zu erstellen, das ein Docker mit mongodb erstellt und automatisch einen Benutzer erstellt.

Ich kann meine Docker-Bilder normalerweise mit Docker-Compose verwalten, aber dieses Mal weiß ich nicht, wie ich das machen soll.

Grundsätzlich muss ich Folgendes tun:

  1. container reinigen/zerstören (docker-compose down)
  2. einen Docker-Container mit mongodb erstellen und starten (ohne --auth parameter
  3. ein Java-Skript mit db.createUser() ausführen
  4. stoppen Sie den Behälter
  5. starten Sie denselben Container erneut mit dem Parameter --auth, um die Anmeldung mit dem im Javascript erstellten Benutzer zuzulassen

Ich finde nicht, wie man das mit Docker-Compose richtig macht, denn wenn es startet, muss ich ihm den Befehl --auth geben. Wenn ich das mache, kann ich mein Javascript nicht ausführen, um meinen Benutzer hinzuzufügen. MongoDB ermöglicht die Erstellung von Benutzern ohne Anmeldung, wenn kein Benutzer vorhanden ist und wenn der Parameter --auth nicht angegeben ist.

Ich möchte das automatisch tun, ich möchte einige Befehle nicht manuell ausführen. Das Ziel ist ein Skript, das vor jedem Integrationstest ausgeführt werden kann, um von einer sauberen Datenbank aus zu starten.

Hier ist mein Projekt: 

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

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

integrationstest/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"

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

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

Einen Weg zu finden, um einen Container erneut mit einem neuen Parameter zu starten (in diesem Fall --auth), wäre hilfreich, aber ich finde nicht, wie das geht (Docker-Start nimmt keine Parameter an).

Irgendeine Idee, wie ich machen soll, was ich möchte? 

Wenn nicht, kann ich immer noch alles aus meiner Datenbank mit etwas Java-Code oder etwas anderem löschen, aber ich möchte, dass ein komplettes Mongodb-Docker-Setup mit einem Skript erstellt wird.

22
jOHNdOE

EDIT: Das tutumcloud-Repository ist veraltet und wird nicht länger gepflegt. Weitere Antworten finden Sie hier

Ich schlage vor, dass Sie Umgebungsvariablen verwenden, um den Mongo-Benutzer, die Datenbank und das Kennwort festzulegen. tutum (im Besitz von Docker) hat ein sehr gutes Image veröffentlicht

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

Sie können diese Variablen in Umgebungsvariablen für Docker-Compose-Umgebungen konvertieren. Sie müssen es nicht hart programmieren. 

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

Diese Konfiguration liest die Umgebungsvariablen Ihrer Sitzung.

12
timchunght

Das offizielle Mongo-Image unterstützt jetzt die folgenden Umgebungsvariablen, die in Docker-Compose wie folgt verwendet werden können:

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

weitere Erklärung unter: https://stackoverflow.com/a/42917632/1069610

19
jzqa

So mache ich es, meine Forderung war, ein paar Container zusammen mit mongodb hochzuziehen, die anderen Container erwarten, dass ein Benutzer anwesend ist, wenn sie auftauchen. Der gute Teil ist, dass der mongoClientTemp nach der Ausführung des Befehls beendet wird, damit der Container nicht hängen bleibt. 

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

datei: 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"

datei: .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

Die Dateien create-admin.js und create-user.js sind Befehle, die Sie mit der Mongo-Shell verwenden. Sie müssen also leicht zu verstehen sein. Die wirkliche Richtung ist wie die Antwort von jzqa, "Umgebungsvariablen" . Die Frage ist also, wie man einen Benutzer erstellt. Ich denke, das beantwortet zumindest diesen Punkt. Sie können das komplette Setup hier überprüfen. https://github.com/Lus1t4nUm/mongo_docker_bootstrap

1
ANormalUser

Nachdem ich die offizielle Docker-Seite mongo gelesen habe, habe ich festgestellt, dass Sie einen Admin-Benutzer einmal anlegen können, auch wenn die Option auth verwendet wird. Dies ist nicht gut dokumentiert, aber es funktioniert einfach (hoffentlich handelt es sich nicht um eine Funktion). Sie können also die Auth-Option immer verwenden.

Ich habe ein github repository erstellt, in dem die zu verwendenden Befehle mit Scripts zusammengefasst wurden. Die wichtigsten Befehlszeilen zum Ausführen sind:

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

In der ersten Zeile wird der Admin-Benutzer erstellt (und Mongo beschwert sich auch nicht mit der Auth-Option). In der zweiten Zeile wird Ihr "normaler" Benutzer mit den Administratorrechten der ersten erstellt.

Mongo-Image enthält den Pfad /docker-entrypoint-initdb.d/ zum Bereitstellen von benutzerdefinierten JS- oder SH-Setupskripten.

Überprüfen Sie diesen Beitrag, um weitere Informationen zu erhalten: Wie erstelle ich eine DB für MongoDB-Container beim Start?

0
Adam Kozyra