2016-05-24 18 views
13

Buona sera,Come creare utente in MongoDB con finestra mobile-compongo

Sto cercando di creare una sorta di script che creerà una finestra mobile con MongoDB e creare automaticamente un utente.

Di solito riesco a gestire le mie immagini di finestra mobile con docker-compose ma questa volta non so come farlo.

In sostanza, ecco quello che devo fare:

1) pulito distruggere container/(finestra mobile-comporre down)

2) creare un contenitore di finestra mobile con MongoDB e avviarlo (senza --auth parametro)

3) eseguire uno script java contenente db.createUser()

4) fermare il contenitore

5) ripetere lo stesso cont con un parametro --auth per consentire il login con l'utente creato nel javascript

Non riesco a trovare come farlo correttamente con la finestra mobile-compose perché quando si avvia, devo dargli il comando --auth . Se lo faccio, non posso eseguire il mio javascript per aggiungere il mio utente. MongoDB consente la creazione degli utenti senza essere connessi se non ci sono utenti e se non viene fornito il parametro --auth.

Voglio farlo automaticamente, non voglio eseguire manualmente alcuni comandi. L'obiettivo è avere uno script che possa essere eseguito prima che ogni test di integrazione inizi da un database pulito.

Ecco il mio progetto:

integrazione-test/src/test/risorse/scripts/finestra mobile-compose.yml

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

integrazione-test/src/test/risorse/scripts/finestra mobile -init.sh

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

integrazione-test/src/test/risorse/scripts/mongodb-setup.js

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

Trovare un modo per riavviare un contenitore con un nuovo parametro (in questo caso --auth) sarebbe di aiuto ma non riesco a trovare come farlo (l'avvio della finestra mobile non accetta i parametri).

Qualche idea su come dovrei fare ciò che vorrei?

In caso contrario, posso ancora eliminare tutto dal mio database con qualche codice Java o qualcos'altro, ma mi piacerebbe una configurazione completa di docker mongodb creata con uno script.

Grazie!

risposta

6

EDIT: Repository è deprecato e non più mantenuto

vi suggerisco di utilizzare variabili di ambiente per impostare utente mongo, database e la password.tutum (di proprietà di Docker) ha pubblicato una buona immagine

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 

Si può convertire queste variabili in variabili ambienti docker-composizione. Non devi codificarlo duro.

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

Questa configurazione leggerà dalle variabili d'ambiente della vostra sessione.

+7

Era giusto, ma questo finestra mobile l'immagine è stata deprecata e queste variabili di ambiente non sono supportate dall'immagine ufficiale:/ – Antoine

+1

L'uso di un'immagine docker non ufficiale per aggiungere funzionalità a un'immagine docker ufficiale potrebbe causare problemi - non c'è garanzia antee che la biblioteca non ufficiale sarà sicura da usare o se verrà mantenuta attivamente. IMHO, @GreenThumb ha suggerito una risposta migliore. – StampyCode

-3

aggiungere l'opzione --noauth al comando mongo

estratto dalla mia finestra mobile-compose.yml file di

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

Benvenuti in Stackoverflow. È sempre bene non solo mostrare un codice funzionante, ma anche spiegare perché risolve un problema. Quindi potresti voler aggiungere una spiegazione su cosa '--noauth' fa. – ImportanceOfBeingErnest

0

Dopo aver letto la Gazzetta mongo docker page, ho scoperto che è possibile creare un amministratore utente una sola volta, anche se viene utilizzata l'opzione auth. Questo non è ben documentato, ma funziona semplicemente (spero che non sia una caratteristica). Pertanto, è possibile continuare a utilizzare l'opzione di autenticazione tutto il tempo.

Ho creato un repository github con gli script che includono i comandi da utilizzare. Le più importanti linee di comando per eseguire sono:

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 prima riga creerà l'utente admin (e Mongo non si lamenterà anche l'opzione di autenticazione con). La seconda riga creerà il tuo utente "normale", utilizzando i diritti di amministratore dal primo.

7

Ecco come lo faccio, il mio requisito era quello di far apparire alcuni contenitori insieme a mongodb, gli altri contenitori si aspettano che un utente sia presente quando arrivano, questo ha funzionato per me. La parte migliore è che mongoClientTemp si chiude dopo l'esecuzione del comando, in modo che il contenitore non si blocchi.

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

L'immagine ufficiale Mongo supporta seguendo variabili d'ambiente che possono essere utilizzati in finestra mobile-comporre, come di seguito:

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

più spiegazione: https://stackoverflow.com/a/42917632/1069610