2015-11-06 5 views
21

Ich brauche Unterstützung hier, um mein eigenes Mongo Docker Bild zu bauen.Wie erstelle ich ein Mongo Docker Image mit Standardkollektionen und Daten?

Ich habe eine Liste von Skripts zum Erstellen und Einfügen von Daten in die MongoDB, die in meiner Dockerfile aufgerufen werden soll, um ein Docker-Image mit Standardkollektionen und Daten zu liefern.

Hier ist, wie meine Dockerfile sieht aus wie zur Zeit:

FROM mongo:latest 

RUN mkdir -p /data/scripts 

COPY . /data/scripts 

RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db/ 

RUN FILES=scripts/*-create.js 
RUN for f in $FILES; do mongo mydb $f; done 

RUN FILES=scripts/*-insert.js 
RUN for f in $FILES; do mongo mydb $f; done 

RUN mongod --shutdown 

ich verschiedene Optionen ausprobiert habe mongod zu starten und zu stoppen und immer einer der beiden ausfallen, das aktuelle Skript erhöhen die folgende Fehlermeldung:

There doesn't seem to be a server running with dbpath: /data/db 

aktualisieren

Nach @ Matt Antwort, die ich erfolgreich die Befehlskette laufen konnte, kann aber immer noch nicht s ee meine Datenbank (genannt my-db), Sammlungen und Daten dort.

Die aktuelle Dockerfile:

FROM mongo:latest 

RUN mkdir -p /data/db/scripts 

COPY . /data/db 

RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db \ 
    && CREATE_FILES=/data/db/scripts/*-create.js \ 
    && for f in $CREATE_FILES; do mongo 127.0.0.1:27017 $f; done \ 
    && INSERT_FILES=/data/db/scripts/*-insert.js \ 
    && for f in $INSERT_FILES; do mongo 127.0.0.1:27017 $f; done \ 
    && mongod --shutdown 

Die Ausgabe aus dem Docker Build-Befehl:

Sending build context to Docker daemon 10.24 kB 
Step 1 : FROM mongo:latest 
---> c08c92f4cb13 
Step 2 : RUN mkdir -p /data/db/scripts 
---> Running in a7088943bb57 
---> 373c7319927d 
Removing intermediate container a7088943bb57 
Step 3 : COPY . /data/db 
---> 8fa84884edb7 
Removing intermediate container ae43e2c24fee 
Step 4 : RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db  && CREATE_FILES=/data/db/scripts/*-create.js && for f in $CREATE_FILES; do mongo 127.0.0.1:27017 $f; done && INSERT_FILES=/data/db/scripts/*-insert.js && for f in $INSERT_FILES; do mongo 127.0.0.1:27017 $f; done && mongod --shutdown 
---> Running in 33970b6865ee 
about to fork child process, waiting until server is ready for connections. 
forked process: 10 
child process started successfully, parent exiting 
MongoDB shell version: 3.0.7 
connecting to: 127.0.0.1:27017/test 
MongoDB shell version: 3.0.7 
connecting to: 127.0.0.1:27017/test 
killing process with pid: 10 
---> 8451e43b7749 
Removing intermediate container 33970b6865ee 
Successfully built 8451e43b7749 

Aber wie gesagt, ich kann immer noch nicht die Datenbank, Sammlungen und Daten in der Datenbank sehen mit Mongo-Shell. Auch angeschlossen ich zur Laufbehälter und bekam die mongodb.log:

2015-11-06T16:15:14.562+0000 I JOURNAL [initandlisten] journal dir=/data/db/journal 
2015-11-06T16:15:14.562+0000 I JOURNAL [initandlisten] recover : no journal files present, no recovery needed 
2015-11-06T16:15:14.698+0000 I JOURNAL [initandlisten] preallocateIsFaster=true 2.36 
2015-11-06T16:15:14.746+0000 I JOURNAL [durability] Durability thread started 
2015-11-06T16:15:14.746+0000 I JOURNAL [journal writer] Journal writer thread started 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] MongoDB starting : pid=10 port=27017 dbpath=/data/db 64-bit host=9c05d483673a 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] **  We suggest setting it to 'never' 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] **  We suggest setting it to 'never' 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] db version v3.0.7 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] git version: 6ce7cbe8c6b899552dadd907604559806aa2e9bd 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] build info: Linux ip-10-183-78-195 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 BOOST_LIB_VERSION=1_49 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] allocator: tcmalloc 
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] options: { processManagement: { fork: true }, storage: { dbPath: "/data/db" }, systemLog: { destination: "file", path: "/var/log/mongodb.log" } } 
2015-11-06T16:15:14.748+0000 I INDEX [initandlisten] allocating new ns file /data/db/local.ns, filling with zeroes... 
2015-11-06T16:15:14.802+0000 I STORAGE [FileAllocator] allocating new datafile /data/db/local.0, filling with zeroes... 
2015-11-06T16:15:14.802+0000 I STORAGE [FileAllocator] creating directory /data/db/_tmp 
2015-11-06T16:15:14.804+0000 I STORAGE [FileAllocator] done allocating datafile /data/db/local.0, size: 64MB, took 0 secs 
2015-11-06T16:15:14.807+0000 I NETWORK [initandlisten] waiting for connections on port 27017 
2015-11-06T16:15:14.830+0000 I NETWORK [initandlisten] connection accepted from 127.0.0.1:49641 #1 (1 connection now open) 
2015-11-06T16:15:14.832+0000 I INDEX [conn1] allocating new ns file /data/db/my-db.ns, filling with zeroes... 
2015-11-06T16:15:14.897+0000 I STORAGE [FileAllocator] allocating new datafile /data/db/my-db.0, filling with zeroes... 
2015-11-06T16:15:14.898+0000 I STORAGE [FileAllocator] done allocating datafile /data/db/my-db.0, size: 64MB, took 0 secs 
2015-11-06T16:15:14.904+0000 I NETWORK [conn1] end connection 127.0.0.1:49641 (0 connections now open) 
2015-11-06T16:15:14.945+0000 I NETWORK [initandlisten] connection accepted from 127.0.0.1:49642 #2 (1 connection now open) 
2015-11-06T16:15:14.958+0000 I NETWORK [conn2] end connection 127.0.0.1:49642 (0 connections now open) 
2015-11-06T16:15:14.982+0000 I CONTROL [signalProcessingThread] got signal 15 (Terminated), will terminate after current cmd ends 
2015-11-06T16:15:14.982+0000 I CONTROL [signalProcessingThread] now exiting 
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] shutdown: going to close listening sockets... 
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] closing listening socket: 6 
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] closing listening socket: 7 
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] removing socket file: /tmp/mongodb-27017.sock 
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] shutdown: going to flush diaglog... 
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] shutdown: going to close sockets... 
2015-11-06T16:15:14.982+0000 I STORAGE [signalProcessingThread] shutdown: waiting for fs preallocator... 
2015-11-06T16:15:14.982+0000 I STORAGE [signalProcessingThread] shutdown: final commit... 
2015-11-06T16:15:15.008+0000 I JOURNAL [signalProcessingThread] journalCleanup... 
2015-11-06T16:15:15.008+0000 I JOURNAL [signalProcessingThread] removeJournalFiles 
2015-11-06T16:15:15.009+0000 I JOURNAL [signalProcessingThread] Terminating durability thread ... 
2015-11-06T16:15:15.088+0000 I JOURNAL [journal writer] Journal writer thread stopped 
2015-11-06T16:15:15.088+0000 I JOURNAL [durability] Durability thread stopped 
2015-11-06T16:15:15.088+0000 I STORAGE [signalProcessingThread] shutdown: closing all files... 
2015-11-06T16:15:15.090+0000 I STORAGE [signalProcessingThread] closeAllFiles() finished 
2015-11-06T16:15:15.090+0000 I STORAGE [signalProcessingThread] shutdown: removing fs lock... 
2015-11-06T16:15:15.090+0000 I CONTROL [signalProcessingThread] dbexit: rc: 0 

ich auch den Ordner/data/db Inhalt geprüft:

[email protected]:/data/db# ls -al 
total 16 
drwxr-xr-x 3 mongodb mongodb 4096 Nov 6 16:15 . 
drwxr-xr-x 4 root root 4096 Nov 6 16:15 .. 
drwxr-xr-x 2 root root 4096 Nov 5 18:55 scripts 

helfen können:

Antwort

23

Das Problem war, dass Informationen nicht unter /db/data gespeichert werden konnten, also habe ich eine Lösung erstellt, die mein eigenes Datenverzeichnis erstellt.

# Parent Dockerfile https://github.com/docker-library/mongo/blob/982328582c74dd2f0a9c8c77b84006f291f974c3/3.0/Dockerfile 
FROM mongo:latest 

# Modify child mongo to use /data/db2 as dbpath (because /data/db wont persist the build) 
RUN mkdir -p /data/db2 \ 
    && echo "dbpath = /data/db2" > /etc/mongodb.conf \ 
    && chown -R mongodb:mongodb /data/db2 

COPY . /data/db2 

RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db2 --smallfiles \ 
    && CREATE_FILES=/data/db2/scripts/*-create.js \ 
    && for f in $CREATE_FILES; do mongo 127.0.0.1:27017 $f; done \ 
    && INSERT_FILES=/data/db2/scripts/*-insert.js \ 
    && for f in $INSERT_FILES; do mongo 127.0.0.1:27017 $f; done \ 
    && mongod --dbpath /data/db2 --shutdown \ 
    && chown -R mongodb /data/db2 

# Make the new dir a VOLUME to persists it 
VOLUME /data/db2 

CMD ["mongod", "--config", "/etc/mongodb.conf", "--smallfiles"] 

Dank des docker-library/mongo Github-Projekt @yosifkit für den Hinweis, dass das Volumen der Daten in dem resultierenden Bild speichern würde. Das habe ich in der Dokumentation vermisst.

+1

Ich habe versucht, das selbst herauszufinden. Warum bleiben die Daten nicht bestehen? – Sergio

+2

@Sergio-Daten bleiben nicht in einem VOLUME erhalten, da sie nach der Erstellung von VOLUME hinzugefügt wurden. Daher bleibt sie in diesem Status, bis ein Container basierend auf dem Image erstellt wird. Wenn Sie Daten in einem Verzeichnis vor der Volume-Erstellung hinzufügen, wird es beibehalten. –

+1

Das war wirklich wichtig. Stellen Sie sicher, dass VOLUME nach dem Ändern der Daten angegeben wird. RUN mkdir -p/data/db HINZUFÜGEN seedMongoDB.js. RUN $ MONGOD_START && mongo tembowms-dev - ruhiges seedMongoDB.js && mongod --shutdown VOLUME/data/db – swateek

8

Während eines Docker-Image-Builds wird jeder Erstellungsbefehl wie RUN in seinem eigenen Docker-Container gestartet und nach Abschluss des Befehls werden die Daten als Image festgeschrieben. Wenn Sie dockviz images --tree während eines Builds ausführen, werden Sie auf die Idee kommen.

In Ihrem Fall hat mongod gestartet und gestoppt lange bevor Sie es brauchen. Sie müssen Mongo starten und Ihre Skripte alle in dem einen RUN Schritt ausführen. Sie können dies erreichen, indem Sie ein Shell-Skript verwenden, das mongod startet und Ihre Daten einfügt.

Ihr Dockerfile läuft:

RUN mongo_create_insert.sh 

Dann mongo_create_insert.sh enthält alle Mongo abhängige Schritte:

#!/usr/bin/env bash 

mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db/ 

FILES=scripts/*-create.js 
for f in $FILES; do mongo mydb $f; done 

FILES=scripts/*-insert.js 
for f in $FILES; do mongo mydb $f; done 

mongod --shutdown 

Als Randbemerkung, neige ich ansible in meinem Basis-Image zu installieren und verwenden, die zu Bereitstellung Docker Bilder in einzelnen RUN Befehl, anstatt viele Shell-RUN-Schritte in einer Dockerfile (das ist nur ein verklärtes Shell-Skript am Ende).Sie verlieren etwas von der Build-Caching-Nice- ness, aber wir haben aus einem Grund die Bereitstellung von Shell-Skripts nicht weiter unterstützt.

+0

Dank @Matt, das war eine sehr schöne Erklärung und jetzt konnte ich das Skript zum Laufen bringen. Obwohl es erfolgreich ausgeführt wird, kann ich die Datenbank nicht sehen, die in meinem laufenden Container erstellt wird. Wenn ich die gleichen Befehle auf dem laufenden Container ausführen, bekomme ich die Datenbank und die Sammlungen wie erwartet erstellt, aber ich bin nicht in der Lage, ein Docker-Bild zu erstellen, die eine Standarddatenbank, Sammlungen und Daten haben. Ich werde die Antwort mit den neuen Details aktualisieren. –

+0

sollte dieses Skript nicht auch auf mongodb warten? – matanster

+0

'mongod' verzweigt nicht, bis es bereit ist, Verbindungen zu akzeptieren. – Matt

Verwandte Themen