在Dockerfile中的Mongorestore

我想创build一个启动mongo服务器的Docker镜像,并在启动时自动从以前的mongodump恢复。


这是我的Dockerfile的图像:

  FROM mongo COPY dump /home/dump CMD mongorestore /home/dump 

当我运行这个,我碰到这个错误:

Failed: error connecting to db server: no reachable servers


有没有办法让mongorestore命令通过Docker运行?

在这个答案的帮助下,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 

这个问题不在docker上。

如果你看看mongo的dockerfile,它会运行启动mongo服务的CMD ["mongod"]

FROM MONGO说,但是你覆盖了CMD线。 这意味着mongo从来没有通过mongod启动。 所以试试CMD mongod; mongorestore /home/dump CMD mongod; mongorestore /home/dump

您可能不希望将其用于生产,但它可以满足您的需求:

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