初始化dockerized mongo上的数据

时间:2016-09-06 11:57:03

标签: mongodb docker

我正在运行一个dockerized mongo容器。

我想用一些初始化数据创建一个mongo图像。

有什么想法吗?

5 个答案:

答案 0 :(得分:28)

更独立的方法:

  • 创建初始化数据库的javascript文件
  • 创建包含这些文件的派生MongoDB docker镜像

有许多答案使用一次性容器或创建卷并链接它们,但这似乎过于复杂。如果您查看mongo docker图像的docker-entrypoint.sh,您会看到第206行使用语法/docker-entrypoint-initdb.d/*.js在初始化时执行mongo <db> <js-file>个文件。如果您创建包含种子数据的派生MongoDB泊坞窗图像,则可以:

  • 有一个docker run命令,它可以使用种子数据
  • 来建立mongo
  • 通过容器停止并启动数据
  • 使用docker stop,rm和run命令重置该数据
  • 使用k8s,mesos,swarm,rancher
  • 等运行时调度程序轻松部署

这种方法特别适合:

  • 只需要一些实际数据进行展示的POC
  • CI / CD管道需要一致的黑盒测试数据
  • 产品演示的示例部署(销售工程师,产品所有者)

如何:

  1. 创建并测试初始化​​脚本(根据需要整理数据)
  2. 为派生图像创建一个Dockerfile,用于复制init脚本

    FROM mongo:3.4
    COPY seed-data.js /docker-entrypoint-initdb.d/
    
  3. 构建您的泊坞窗图片

    docker build -t mongo-sample-data:3.4 .
    
  4. (可选)将图像推送到docker注册表以供其他人使用

  5. 运行您的泊坞窗图片

    docker run                               \
        --name mongo-sample-data             \
        -p 27017:27017                       \
        --restart=always                     \
        -e MONGO_INITDB_DATABASE=application \
        -d mongo-sample-data:3.4
    
  6. 默认情况下,docker-entrypoint.sh会将您的脚本应用于test db;上面的运行命令env var MONGO_INITDB_DATABASE=application将把这些脚本应用到application db。或者,您可以在js文件中创建并切换到不同的dbs。

    我有一个github repo就是这样 - 这里是relevant files

答案 1 :(得分:4)

首先创建一个泊坞窗卷

docker volume create --name mongostore

然后创建你的mongo容器

docker run -d --name mongo -v mongostore:/data/db mongo:latest

此处的-v开关负责将卷mongostore安装在/data/db位置,这是mongo保存其数据的位置。卷是持久的(在主机上)。即使没有容器运行,您也会看到

列出的mongostore卷
docker volume ls

您可以杀死容器并创建一个新容器(与上面相同的行),新的mongo容器将获取上一个容器的状态。

初始化音量 如果没有,则Mongo初始化新数据库。这负责在mongostore中创建初始数据。假设您想使用预先播种的数据库创建一个全新的环境。问题变为如何在创建mongo容器之前将数据从本地环境(例如)传输到卷。我将列出两个案例。

  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 czf mongodata.tar.gz /Users/myname/work/mongodb
    

    然后创建一个临时容器来解压缩并将文件复制到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
    
  3. 您也可以将文件复制到远程主机并从那里安装,但我倾向于避免与远程主机进行交互。

    声明。我是从记忆中写的(没有测试)。

答案 2 :(得分:3)

在mongo docker的最新版本中,类似的东西对我有用。

FROM mongo
COPY dump /home/dump
COPY mongo_restore.sh /docker-entrypoint-initdb.d/

mongo恢复脚本如下。

#!/bin/bash
# Restore from dump
mongorestore --drop --gzip --db "<RESTORE_DB_NAME>" /home/dump

您可以正常构建图像。

docker build -t <TAG> .

答案 3 :(得分:0)

我找到了一种对我来说更容易的方式。

假设您的服务器上的docker容器中有一个数据库,并且您想备份它,这就是您可以做的。

与您的设置有所不同的是您的mongo泊坞窗容器的名称[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

P.S:Tim Brandin的原始资料来源于https://blog.studiointeract.com/mongodump-and-mongorestore-for-mongodb-in-a-docker-container-8ad0eb747c62

谢谢!

答案 4 :(得分:0)

这是如何使用docker-compose完成的。我使用了较旧的mongo映像,但是docker-entrypoint.sh接受* .js和* .sh文件用于所有版本的映像。

docker-compose.yaml

version: '3'

services:
  mongo:
    container_name: mongo
    image: mongo:3.2.12
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db:cached
      - ./deploy/local/mongo_fixtures /fixtures
      - ./deploy/local/mongo_import.sh:/docker-entrypoint-initdb.d/mongo_import.sh

volumes:
  mongo-data:
    driver: local

mongo_import.sh:

#!/bin/bash
# Import from fixtures

mongoimport --db wcm-local --collection clients --file /fixtures/properties.json && \
mongoimport --db wcm-local --collection configs --file /fixtures/configs.json

我的monogo_fixtures json文件是monogoexport的产品,其格式如下:

{"_id":"some_id","field":"value"}
{"_id":"another_id","field":"value"}

这应该对那些没有自定义Dockefile的人有所帮助,只需在docker-compose文件中直接使用具有正确入口点设置的图像即可。干杯!