2016-09-02 6 views
6

mongoサーバーを起動し、起動時に以前のmongodumpから自動的に復元するDockerイメージを作成したいとします。ここでDockerfileのMongorestore


画像のための私のDockerfileです:

FROM mongo 

COPY dump /home/dump 

CMD mongorestore /home/dump 

私はこれを実行すると、私はこのエラーに遭遇:

Failed: error connecting to db server: no reachable servers


を取得する方法はありますDockerを実行するコマンドはmongorestoreですか?

答えて

1

問題はドッカーではありません。

dockerfile for mongoを見ると、CMD ["mongod"]が実行され、mongoサービスが開始されます。

あなたはFROM MONGOと言っていますが、CMD行を上書きしました。これは、mongoがmongodで始まったことがないことを意味します。だから試してみてくださいCMD mongod; mongorestore /home/dump

+0

お返事ありがとうございます!そして、あなたは正しいです、私は今夜早くそのファイルを見て、最後の 'CMD'だけが動くことに気付きました。しかし、 'CMD mongod; mongorestore/home/dump'コマンドは実行されません。私は 'mongod&mongorestore/home/dump'を試してもう少し近づいた。まだ運がありません。 – RyanNHG

+0

mongod&mongorestore/home/dumpは、mongodがフォアグラウンドで実行されているため、ブロックされているため動作しません。 ryanHNGの回答を使用 –

10

this answerからの助けを借りて、Marc Youngの答えと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'に移動して、スクリプトをより再利用できるようにしました: 'mongo.sh'の' eval $ MONGORESTORE_CMD'と 'RUN MONGORESTORE_CMD = 'mongorestore --drop/home/dump 'Dockerfile'に' 'を追加します。最後に、/ entrypoint-with-mongorestore.shというスクリプトを最終的に呼び出すことも理にかなっていると思いました。 –

+1

イメージを作成するたびにデータベースを復元する必要がありますか?これはCMDの代わりに "RUN"ではありませんか? ["CMD /home/mongo.sh"] –

+0

このアプローチを試してみると、 '/entrypoint.sh:No such file or directory'と表示されます。 '。/ 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