2016-09-02 11 views
6

Chcę utworzyć obraz Docker, który uruchamia serwer mongo i automatycznie przywraca przy starcie mongodump przy starcie.Mongorestore w Dockerfile


Oto moja Dockerfile do obrazka:

FROM mongo 

COPY dump /home/dump 

CMD mongorestore /home/dump 

Kiedy uruchamiam to, biegnę do tego błędu:

Failed: error connecting to db server: no reachable servers


Czy istnieje jakiś sposób, aby uzyskać komenda mongorestore do uruchamiania przez Docker?

Odpowiedz

1

Problem nie dotyczy doku.

Jeśli spojrzysz na dockerfile for mongo, uruchomi ona CMD ["mongod"], która uruchomi usługę Mongo.

Powiedziałeś, że FROM MONGO, ale zastąpiłeś linię CMD. oznacza to, że mongo nigdy się nie zaczęło przez mongod. więc spróbuj CMD mongod; mongorestore /home/dump

+0

Dziękuję za odpowiedź! I masz rację, wczoraj rzuciłem okiem na ten plik i zdałem sobie sprawę, że uruchomi się tylko ostatni "CMD". Jednak z 'CMD mongod; mongorestore/home/dump', polecenie 'mongorestore' nigdy nie działa. Próbowałem 'mongod & mongorestore/home/dump' i zbliżyłem się trochę. Wciąż nie ma szczęścia. – RyanNHG

+0

mongod & mongorestore/home/dump nie będzie działać, ponieważ mongod działa na pierwszym planie i dlatego jest blokowany. Użyj odpowiedzi z ryanHNG –

10

Przy pomocy this answer, odpowiedzi Marca Younga i referencji Dockerfile, udało mi się to zadziałać.


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 

+0

Przesunąłem polecenie 'mongorestore' do' Dockerfile', aby skrypt był bardziej możliwy do ponownego użycia: 'eval $ MONGORESTORE_CMD' w' mongo.sh' i 'RUN MONGORESTORE_CMD = 'mongorestore --drop/home/dump "' w 'Dockerfile'. Pomyślałem, że sensowne jest również wywołanie skryptu '/ entrypoint-with-mongorestore.sh' w końcu. –

+1

Czy baza danych musi zostać przywrócona za każdym razem, gdy tworzony jest obraz? Czy nie powinien to być "RUN" zamiast CMD? ["CMD /home/mongo.sh"] –

+0

Próbując tego podejścia, otrzymuję '/entrypoint.sh: Brak takiego pliku lub katalogu'. Zmiana './Entrypoint.sh' na' docker-entrypoint.sh' (zwróć uwagę na zmianę z absolutnej na względną) dała podstęp. – Laizer

0

Prawdopodobnie nie chcą skorzystać z tej produkcji, ale robi to co trzeba:

== Dockerfile == 
FROM mongo:3 

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

ENTRYPOINT /restore.sh 

następnie

== 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