在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容器之前将数据从本地环境(例如)传输到卷。 我会列举两个案例。

  1. 当地环境

    您正在使用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 

    这不适用于云存储。 在这种情况下,你需要复制文件。

  2. 远程环境(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的一致性数据
  • 产品演示的示例部署(销售工程师,产品所有者)

如何:

  1. 创build并testing您的初始化脚本(适当修饰数据)
  2. 为您的派生映像创build一个Dockerfile,以复制您的init脚本

     FROM mongo:3.4 COPY seed-data.js /docker-entrypoint-initdb.d/ 
  3. build立你的docker形象

     docker build -t mongo-sample-data:3.4 . 
  4. 或者,将图像推送到dockerregistry以供其他人使用

  5. 运行你的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会将这些脚本applicationapplication 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

谢谢!