用于mongodump的docker-machine ssh命令

时间:2015-09-15 17:08:02

标签: mongodb ssh docker mongodump docker-machine

设置问题:

创建数据卷容器

$ docker create --name dbdata -v /dbdata mongo /bin/true

在链接到数据卷容器的容器中启动mongo

$ docker run -d --name mongo --volumes-from dbdata mongo

验证您是否可以使用mongo客户端连接到mongo

$ docker run -it --link mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'

问题:

docker-machine ssh需要hostcommand参数才能在主机上执行。我想执行以下mongodump命令,该命令在我进入docker主机后工作:

$ docker-machine ssh demo
root@demo:~# docker run --rm --link mongo:mongo -v $HOME:/backup mongo bash -c 'mongodump --out /backup --host $MONGO_PORT_27017_TCP_ADDR'
2015-09-15T16:34:02.676+0000    writing test.samples to /backup/test/samples.bson
2015-09-15T16:34:02.678+0000    writing test.samples metadata to /backup/test/samples.metadata.json
2015-09-15T16:34:02.678+0000    done dumping test.samples (1 document)
2015-09-15T16:34:02.679+0000    writing test.system.indexes to /backup/test/system.indexes.bson

但是,使用docker-machine ssh命令在一个步骤中执行上述命令对我来说不起作用:

$ docker-machine ssh demo -- docker run --rm --link mongo:mongo -v $HOME:/backup mongo bash -c 'mongodump --out /backup --host $MONGO_PORT_27017_TCP_ADDR'
SSH cmd error!
command: docker run --rm --link mongo:mongo -v /Users/tony:/backup mongo bash -c mongodump --out /backup --host $MONGO_PORT_27017_TCP_ADDR
err    : exit status 1
output : 2015-09-15T16:53:07.717+0000   Failed: error connecting to db server: no reachable servers

因此,如果运行mongodump命令的容器无法连接到mongo容器,我认为--host $MONGO_PORT_27017_TCP_ADDR可能存在问题(它应该按原样传递到容器中,所以过早的扩张导致一个空的字符串?),但有点难过试图纠正它。任何想法都表示赞赏。

更新:我向前迈进了一步。以下似乎正确执行命令,但数据未写入系统并且会话挂起:

$ docker-machine ssh demo -- $(docker run --rm --link mongo:mongo -v $HOME:/backup mongo bash -c 'mongodump --out /backup --host $MONGO_PORT_27017_TCP_ADDR')
2015-09-15T18:02:03.347+0000    writing test.samples to /backup/test/samples.bson
2015-09-15T18:02:03.349+0000    writing test.samples metadata to /backup/test/samples.metadata.json
2015-09-15T18:02:03.349+0000    done dumping test.samples (1 document)
2015-09-15T18:02:03.350+0000    writing test.system.indexes to /backup/test/system.indexes.bson

2 个答案:

答案 0 :(得分:1)

这个问题要求基于docker ssh的解决方案,但由于没有人回复,我自己会回答这个问题,无论如何都是一个更好的解决方案。

正如Nathan LeClaire(@upthecyberpunks)通过Twitter建议的那样,更好的解决方案是完全避免麻烦,只需运行一个容器来执行mongodump命令。

$ docker run \
    --rm \
    --link mongo:mongo \
    -v /root:/backup mongo bash \
    -c 'mongodump --out /backup --host $MONGO_PORT_27017_TCP_ADDR'

答案不是技术上要求,但是生成的测试数据库备份文件可以通过docker scp从docker主机传输到当前目录:

$ docker-machine scp -r dev:/root/test .

答案 1 :(得分:0)

由于我无法向orginal nice answer添加评论,只需在此处添加一些说明,$MONGO_PORT_27017_TCP_ADDR应该是我们机器的IP,例如,我虚拟机中的虚拟机的ip为{{ 1}},所以最后一行应该是:

100.100.100.10

-c 'mongodump --out /backup --host 100.100.100.10'

如果没有添加-c 'mongodump --out /backup --host 100.100.100.10:27017'字段,我们很可能会遇到一些错误,例如: host

再次感谢原始回答^ _ ^。