2016-09-02 3 views
6

Я хочу создать изображение Docker, которое запускает сервер mongo и автоматически восстанавливается с предыдущего mongodump при запуске.Mongorestore в файле Docker


Вот мой Dockerfile для изображения:

FROM mongo 

COPY dump /home/dump 

CMD mongorestore /home/dump 

Когда я запускаю это, я бегу в эту ошибку:

Failed: error connecting to db server: no reachable servers


Есть ли способ, чтобы получить команду mongorestore для запуска через Docker?

ответ

1

проблема не с докером.

Если вы посмотрите на dockerfile for mongo, он запустит CMD ["mongod"], который начинает обслуживание монго.

Вы сказали FROM MONGO, но вы переписали линию CMD. это означает, что монго никогда не начиналось с mongod. поэтому попробуйте CMD mongod; mongorestore /home/dump

+0

Спасибо за ответ! И вы правы, я взглянул на этот файл сегодня вечером и понял, что будет работать только последний 'CMD'. Однако, с 'CMD mongod; mongorestore/home/dump', команда 'mongorestore' никогда не запускается. Я попробовал «mongod & mongorestore/home/dump» и немного поближе. Тем не менее, не удача. – RyanNHG

+0

mongod & mongorestore/home/dump не будет работать, поскольку mongod работает на переднем плане и таким образом блокируется. Используйте ответ от ryanHNG –

10

С помощью this answer, ответа Марка Янга и ссылки Dockerfile я смог получить эту работу.


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

Я переместил команду 'mongorestore' в' Dockerfile', чтобы сделать сценарий более многоразовым: 'eval $ MONGORESTORE_CMD' в' mongo.sh' и 'RUN MONGORESTORE_CMD = 'mongorestore --drop/home/dump ''в' Dockerfile'. Я подумал, что имеет смысл также вызвать сценарий '/ entrypoint-with-mongorestore.sh'. –

+1

Нужно ли восстанавливать базу данных каждый раз при создании образа? Разве это не должно быть «RUN» вместо CMD? ["CMD /home/mongo.sh"] –

+0

При попытке этого подхода я получаю '/entrypoint.sh: Нет такого файла или каталога'. Изменение './Entrypoint.sh' на' docker-entrypoint.sh' (обратите внимание на изменение от абсолютного на относительное) выполнило трюк. – Laizer

0

Вы, вероятно, не хотите использовать это для производства, но это то, что вам нужно:

== Dockerfile == 
FROM mongo:3 

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

ENTRYPOINT /restore.sh 

затем

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