2016-05-24 5 views
13

Guter Abend,Wie Benutzer in mongodb mit erstellen Docker-komponieren

Ich versuche, eine Art von Skript zu erstellen, die eine Docker mit mongodb erstellen und automatisch einen Benutzer erstellen.

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

Grundsätzlich ist hier, was ich zu tun habe:

1) reinigen/zerstören Behälter (Docker-komponieren unten)

2) erstellen Docker-Container mit mongodb und starten Sie es (ohne --auth Parameter)

3)

4) stoppen, den Behälter

5) den Neustart des gleichen cont ein Java Script enthält db.createUser() ausführen ainer mit --auth Parametern Anmeldung mit dem Benutzer in der Javascript

erstellt, damit

ich nicht finden kann, wie Sie richtig mit Docker-komponiert, weil, wenn es beginnt, ich habe ihm den Befehl geben, --auth . Wenn ich das tue, kann ich mein Javascript nicht ausführen, um meinen Benutzer hinzuzufügen. MongoDB ermöglicht die Benutzererstellung ohne angemeldet zu sein, wenn kein Benutzer vorhanden ist und der Parameter --auth nicht angegeben ist.

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

Hier ist mein Projekt:

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" } 
    ] 
}) 

Einen Weg zu finden, um einen Container mit einem neuen Parameter (in diesem Fall --auth) erneut zu starten, würde helfen, aber ich kann nicht finden, wie man das macht (docker start nimmt keine Parameter).

Irgendeine Idee, wie ich tun sollte, was ich möchte?

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

Vielen Dank!

Antwort

6

EDIT: Repository ist veraltet und wird nicht mehr gepflegt

Ich schlage vor, dass Sie Umgebungsvariablen verwenden Mongo Benutzer, Datenbank und Passwort festlegen.tutum (im Besitz von Docker) veröffentlicht ein sehr gutes Bild

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 Docker-compose Umgebungen Variablen konvertieren. Sie müssen es nicht hart codieren.

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

wird diese Konfiguration von Ihrer Sitzung Umgebungsvariablen lesen.

+7

Es war richtig, aber das Docker image ist veraltet, und diese Umgebungsvariablen werden vom offiziellen Image nicht unterstützt:/ – Antoine

+1

Wenn Sie ein offizielles Docker-Image zum Hinzufügen von Features zu einem offiziellen Docker-Image verwenden, kann dies zu Problemen führen - es gibt kein Guar dass die inoffizielle Bibliothek sicher zu verwenden ist oder aktiv verwaltet wird. IMHO, @GreenThumb hat eine bessere Antwort vorgeschlagen. – StampyCode

-3

--noauth Option auf den Befehl Mongo hinzufügen

Extrakt aus meiner Docker-compose.yml Datei

mongors: 
    image: mongo:latest 
    command: mongod --noprealloc --smallfiles --replSet mongors2 --dbpath /data/db --nojournal --oplogSize 16 --noauth 
    environment: 
    TERM: xterm 
    volumes: 
    - ./data/mongors:/data/db 
+0

Willkommen bei Stackoverflow. Es ist immer gut, nicht nur einen funktionierenden Code zu zeigen, sondern auch zu erklären, warum er ein Problem löst. Vielleicht möchten Sie eine Erklärung hinzufügen, was '--noauth' macht. – ImportanceOfBeingErnest

0

Nach dem den offiziellen mongo docker page lesen, habe ich festgestellt, dass Sie einen Admin erstellen können Benutzer ein einziges Mal, auch wenn die Auth-Option verwendet wird. Dies ist nicht gut dokumentiert, aber es funktioniert einfach (hoffe, es ist kein Feature). Daher können Sie die Auth-Option weiterhin verwenden.

Ich habe ein github Repository mit Scripts erstellt, die die zu verwendenden Befehle enthalten. Die wichtigsten Befehlszeilen auszufü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 

Die erste Zeile wird den Admin-Benutzer erstellen (und Mongo wird nicht einmal mit Auth-Option beschweren). Die zweite Zeile erstellt Ihren "normalen" Benutzer mit den Administratorrechten von der ersten.

7

Dies ist, wie ich es tue, meine Anforderung war, ein paar Container zusammen mit mongodb zu bringen, die anderen Container erwarten einen Benutzer anwesend zu sein, wenn sie heraufkommen, das hat für mich funktioniert. Der gute Teil ist, dass der mongoClientTemp beendet wird, nachdem der Befehl ausgeführt wurde, so dass der Container nicht festhält.

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 
8

Die offizielle Mongo Bild unterstützt nun folgende Umgebungsvariablen, die in verwendet werden können Docker-komponieren wie folgt:

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

mehr Erklärung an: https://stackoverflow.com/a/42917632/1069610

Verwandte Themen