wake-up-neo.net

Mongorestore in einem Dockerfile

Ich möchte ein Docker-Image erstellen, das einen Mongo-Server startet und beim Start automatisch aus einer vorherigen mongodump wiederhergestellt wird.


Hier ist meine Dockerfile für das Bild:

 FROM mongo

 COPY dump /home/dump

 CMD mongorestore /home/dump

Wenn ich das ausführen, stoße ich auf diesen Fehler:

Failed: error connecting to db server: no reachable servers


Gibt es eine Möglichkeit, den Befehl mongorestore durch Docker auszuführen?

13
RyanNHG

Mit Hilfe von dieser Antwort , Marc Youngs Antwort und der Dockerfile-Referenz konnte ich dies zum Laufen bringen.


Dockerfile

FROM mongo

COPY dump /home/dump
COPY mongo.sh /home/mongo.sh
RUN chmod 777 /home/mongo.sh

CMD /home/mongo.sh

mongo.sh

#!/bin/bash

# Initialize a mongo data folder and logfile
mkdir -p /data/db
touch /var/log/mongodb.log
chmod 777 /var/log/mongodb.log

# Start mongodb with logging
# --logpath    Without this mongod will output all log information to the standard output.
# --logappend  Ensure mongod appends new entries to the end of the logfile. We create it first so that the below tail always finds something
/entrypoint.sh mongod --logpath /var/log/mongodb.log --logappend &

# Wait until mongo logs that it's ready (or timeout after 60s)
COUNTER=0
grep -q 'waiting for connections on port' /var/log/mongodb.log
while [[ $? -ne 0 && $COUNTER -lt 60 ]] ; do
    sleep 2
    let COUNTER+=2
    echo "Waiting for mongo to initialize... ($COUNTER seconds so far)"
    grep -q 'waiting for connections on port' /var/log/mongodb.log
done

# Restore from dump
mongorestore --drop /home/dump

# Keep container running
tail -f /dev/null

13
RyanNHG

Dies ist eine alte Frage und die obige Lösung könnte immer noch funktionieren, aber in späteren Versionen können Sie in /docker-entrypoint-initdb.d/ .sh- und .js-Skripte hinzufügen, die ausgeführt werden, wenn die Instanz zum ersten Mal geladen wird (/ data/db ist leer).

Jetzt könnte Dockerfile ungefähr so ​​aussehen:

FROM mongo

COPY ./data-dump/ /tmp/dump/mydb/

COPY ./import_data.sh /docker-entrypoint-initdb.d/import_data.sh

CMD chmod 777 /docker-entrypoint-initdb.d/import_data.sh #this is probably to permissive

Damit, was auch immer in import_data.sh wird beim ersten Start des Containers ausgeführt (oder alle anderen Dateien, die Sie dort haben).

# change the mongorestore command to match your case, adding user/password and other options.
mongorestore /tmp/dump # note we can possibly restore many DBs. 

Es ist dokumentiert hier unter Initialisieren einer neuen Instanz

5
Tomer Cagan

das Problem liegt nicht bei Docker.

Wenn Sie sich die dockerfile für mongo anschauen , wird CMD ["mongod"] ausgeführt, wodurch der mongo-Dienst gestartet wird.

Sie sagten FROM MONGO, aber Sie haben die CMD-Zeile überschrieben. Dies bedeutet, dass Mongo nie über mongod gestartet wurde. also versuche CMD mongod; mongorestore /home/dump

1
Marc Young

Sie möchten dies wahrscheinlich nicht für die Produktion verwenden, aber es macht, was Sie brauchen:

== Dockerfile ==
FROM mongo:3

COPY restore.sh /restore.sh
COPY ./mongodump /dump/

ENTRYPOINT /restore.sh

dann

== restore.sh ==
#!/usr/bin/env bash

# Execute restore in the background after 5s
# https://docs.docker.com/engine/reference/run/#detached--d
sleep 5 && mongorestore /dump &

# Keep mongod in the foreground, otherwise the container will stop
docker-entrypoint.sh mongod
0
pgpb.padilla

Eine ähnliche Lösung wie bei RyanNHG, jedoch ohne SH-Datei.

Dockerfile

FROM mongo:3.6.8

COPY dump/ /tmp/dump/

CMD mongod --fork --logpath /var/log/mongodb.log; \
    mongorestore /tmp/dump/; \
    mongod --shutdown; \
    docker-entrypoint.sh mongod
0
hisener