在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