在dockerized mongo上初始化数据
我正在运行一个dockerized的mongo容器。
我想用一些初始化的数据创build一个mongo图像。
有任何想法吗?
首先创build一个docker卷
docker volume create --name mongostore
然后创build您的mongo容器
docker run -d --name mongo -v mongostore:/data/db mongo:latest
这里的-v
开关负责将mongostore
到/data/db
位置,这是mongo保存数据的地方。 卷是持久的(在主机上)。 即使没有容器运行,你会看到你列出的mongostore卷
docker volume ls
您可以杀死容器并创build一个新的容器(与上面相同的行),新的容器将拾取前一个容器的状态。
初始化卷 Mongo初始化一个新的数据库(如果没有的话)。 这是负责在mongostore中创build初始数据。 假设您要使用预先播种的数据库创build全新的环境。 问题在于如何在创buildmongo容器之前将数据从本地环境(例如)传输到卷。 我会列举两个案例。
-
当地环境
您正在使用Docker for Mac / Windows或Docker Toolbox。 在这种情况下,您可以轻松地将本地驱动器安装到临时容器以初始化卷。 例如:
docker run --rm -v /Users/myname/work/mongodb:/incoming \ -v mongostore:/data alpine:3.4 cp -rp /incoming/* /data
这不适用于云存储。 在这种情况下,你需要复制文件。
-
远程环境(AWS,GCP,Azure,…)
对tar进行压缩/压缩是加速上传的一个好主意。
tar czf mongodata.tar.gz /Users/myname/work/mongodb
然后创build一个临时容器来解压并将文件复制到mongostore。
tail -f /dev/null
只是确保容器不会退出。docker run -d --name temp -v mongostore:/data alpine:3.4 tail -f /dev/null
将文件复制到它
docker cp mongodata.tar.gz temp:.
解决并移动到音量
docker exec temp tar xzf mongodata.tar.gz && cp -rp mongodb/* /data
清理
docker rm temp
您也可以将文件复制到远程主机并从那里挂载,但我倾向于避免与远程主机进行交互。
免责声明。 我正在写内存(没有testing)。
一个更独立的方法:
- 创build初始化您的数据库的JavaScript文件
- 创build包含这些文件的派生MongoDB泊坞窗图像
有很多答案使用一次性容器或创build卷和链接,但这似乎过于复杂。 如果你看看mongo docker镜像的docker-entrypoint.sh ,你会看到206 /docker-entrypoint-initdb.d/*.js
初始化时使用语法执行/docker-entrypoint-initdb.d/*.js
文件: mongo <db> <js-file>
。 如果您创build包含种子数据的衍生MongoDB泊坞窗图像,则可以:
- 有一个单一的docker运行命令,站起来与种子数据的孟戈
- 数据通过容器停止并启动
- 使用docker stop,rm和运行命令重置数据
- 轻松部署运行时调度程序,如k8s,mesos,swarm,rancher
这种方法特别适合于:
- POC只需要一些现实的数据来显示
- CI / CDpipe道需要黑箱testing的一致性数据
- 产品演示的示例部署(销售工程师,产品所有者)
如何:
- 创build并testing您的初始化脚本(适当修饰数据)
-
为您的派生映像创build一个Dockerfile,以复制您的init脚本
FROM mongo:3.4 COPY seed-data.js /docker-entrypoint-initdb.d/
-
build立你的docker形象
docker build -t mongo-sample-data:3.4 .
-
或者,将图像推送到dockerregistry以供其他人使用
-
运行你的docker图像
docker run \ --name mongo-sample-data \ -p 27017:27017 \ --restart=always \ -e MONGO_INITDB_DATABASE=application \ -d mongo-sample-data:3.4
默认情况下,docker-entrypoint.sh会将脚本应用到test
数据库; 上面的运行命令env var MONGO_INITDB_DATABASE=application
会将这些脚本application
到application
db中。 或者,您可以创build并切换到js文件中的不同dbs。
我有一个github回购,做到这一点 – 这里是相关的文件 。
我发现了一种对我来说更简单的方法。
假设你的服务器上有一个docker容器中的数据库,并且你想备份它,那么你可以做些什么。
可能与您的设置不同的是您的mongo docker容器的名称[ mongodb
](使用elastic_spence
时的默认值)。 因此,请确保先用--name mongodb
启动容器,以匹配以下步骤:
$ docker run \ --rm \ --link mongodb:mongo \ -v /root:/backup \ mongo \ bash -c 'mongodump --out /backup --host $MONGO_PORT_27017_TCP_ADDR'
并从转储中恢复数据库。
$ docker run \ --rm \ --link mongodb:mongo \ -v /root:/backup \ mongo \ bash -c 'mongorestore /backup --host $MONGO_PORT_27017_TCP_ADDR'
如果您需要从您的服务器下载转储,您可以使用scp:
$ scp -r root@IP:/root/backup ./backup
或者上传它:
$ scp -r ./backup root@IP:/root/backup
PS:Tim Brandin的原始资料可在https://blog.studiointeract.com/mongodump-and-mongorestore-for-mongodb-in-a-docker-container-8ad0eb747c62
谢谢!