2015-07-03 25 views
36

Sto cercando di distribuire una serie di applicazioni connesse in esecuzione in più contenitori collegati che include un database mongo che è necessario per:Come seminare un database mongo usando la finestra mobile-compose?

  • essere distribuiti contenente alcuni dati seme;
  • consente agli utenti di aggiungere ulteriori dati.

Idealmente i dati verranno mantenuti anche in un contenitore di volume di dati collegato.

posso ottenere i dati nel mongo contenitore utilizzando un'istanza mongo base che non montare tutti i volumi (immagine dockerhub: psychemedia/mongo_nomount - questo è essenzialmente la base Mongo Dockerfile senza la dichiarazione VOLUME /data/db) e una configurazione Dockerfile lungo le linee di:

ADD . /files 
WORKDIR /files 
RUN mkdir -p /data/db && mongod --fork --logpath=/tmp/mongodb.log && sleep 20 && \ 
mongoimport --db testdb --collection testcoll --type csv --headerline --file ./testdata.csv #&& mongod --shutdown 

dove ./testdata.csv è nella stessa directory (./mongo-with-data) come Dockerfile.

mio file di configurazione finestra mobile-composizione include quanto segue:

mongo: 
    #image: mongo 
    build: ./mongo-with-data 
    ports: 
    - "27017:27017" 
    #Ideally we should be able to mount this against a host directory 
    #volumes: 
    # - ./db/mongo/:/data/db 
    #volumes_from: 
    # - devmongodata 

#devmongodata: 
# command: echo created 
# image: busybox 
# volumes: 
#  - /data/db 

Ogni volta che provo a montare un volume sembra come se i dati testa di serie originale - che è memorizzato in /data/db - viene eliminato. Immagino che quando un volume viene montato su /data/db sostituisce ciò che è attualmente presente.

Detto questo, il docker userguide suggerisce che: I volumi vengono inizializzati quando viene creato un contenitore. Se l'immagine di base del contenitore contiene dati nel punto di montaggio specificato, i dati esistenti vengono copiati nel nuovo volume al momento dell'inizializzazione del volume? Quindi mi aspettavo che i dati persistessero se ho inserito il comando VOLUME dopo il comando di seeding RUN?

Quindi cosa sto sbagliando?

La lunga vista è che voglio automatizzare la build di diversi contenitori collegati, e quindi distribuire un file YAML Vagrantfile/finestra mobile-composizione che il fuoco su un gruppo di app collegate, che include un mongo di database pre-teste di serie con un contenitore di dati persistenti (parzialmente precompilato).

+0

Credo che quello che voglio fare nella fase di costruzione è il Monte del db contenitore su un nuovo contenitore del volume di dati in modo che i dati nella directory del contenitore di database vengano inseriti nel volume di dati, anziché montare il contenitore del volume di dati nel contenitore del db, che sovrascrive i dati che ho appena importato. – psychemedia

+0

Dopo aver stabilito un contenitore del volume di dati con i dati iniziali, posso distruggere il contenitore del database originale e quindi collegare semplicemente un contenitore mongodb semplice al contenitore del volume di dati per l'utilizzo da parte dell'utente finale. Il cuore della domanda originale ora è questo: qual è il modo più semplice per creare e popolare un contenitore di volumi di dati a cui un contenitore mongod possa connettersi? – psychemedia

+0

Con 'Rails' utilizzo' docker-compose eseguire container_name rake db: seed' –

risposta

47

Lo faccio utilizzando un altro contenitore di finestra mobile il cui unico scopo è quello di seminare mongo, quindi uscire. Sospetto che questa sia la stessa idea di ebaxt, ma quando cercavo una risposta a questo, volevo solo vedere un esempio rapido e sporco, ma semplice. Così qui è la mia:

finestra mobile-compose.yml

mongodb: 
    image: mongo 
    ports: 
    - "27017:27017" 

mongo-seed: 
    build: ./mongo-seed 
    links: 
    - mongodb 

# my webserver which uses mongo (not shown in example) 
webserver: 
    build: ./webserver 
    ports: 
    - "80:80" 
    links: 
    - mongodb 

mongo-seme/Dockerfile

FROM mongo 

COPY init.json /init.json 
CMD mongoimport --host mongodb --db reach-engine --collection MyDummyCollection --type json --file /init.json --jsonArray 

mongo-seme/init.json

[ 
    { 
    "name": "Joe Smith", 
    "email": "[email protected]", 
    "age": 40, 
    "admin": false 
    }, 
    { 
    "name": "Jen Ford", 
    "email": "[email protected]", 
    "age": 45, 
    "admin": true 
    } 
] 
+0

Quali sono i pro e i contro dell'utilizzo di una finestra mobile esterna per effettuare il seeding? –

+4

Preferisco mantenere le cose separate e semplici, e ho scoperto che di solito mi presta la massima flessibilità ... Per esempio ... se voglio cambiare qualcosa nel mio file seme, ho bisogno di ricostruirlo. Se i miei semi fossero la stessa immagine della mia istanza di mongo in esecuzione, perderei i miei dati mongo a causa del reset. Ovviamente, potrei esportare e importare, ma è più lavoro. –

+0

L'esecuzione del modulo precedente usando 'mongorestore' sembra dare un errore' uscito con codice 0'? – psychemedia

0

Per rispondere alla mia domanda:

  • semplice file YAML per creare semplice contenitore mongo collegato a un contenitore di volume di dati, licenziato dalla Vagrant finestra mobile di composizione.
  • nel Vagrantfile, il codice sulla falsariga di:

config.vm.provision :shell, :inline => <<-SH docker exec -it -d vagrant_mongo_1 mongoimport --db a5 --collection roads --type csv --headerline --file /files/AADF-data-minor-roads.csv SH

per importare i dati.

Imballare la scatola.

Distribuire la scatola.

Per l'utente, un semplice Vagrantfile per caricare la scatola ed eseguire una semplice finestra mobile: comporre lo script YAML per avviare i contenitori e montare il dongo mongo sul contenitore del volume di dati.

0

È possibile utilizzare questo image che fornisce il contenitore finestra mobile per molti lavori (importazione, esportazione, di dump)

sguardo al example utilizzando finestra mobile-comporre

Problemi correlati