初始化dockerized mongo上的数据

Jor*_*rdi 17 mongodb docker

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

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

有任何想法吗?

Ste*_*ver 30

一种更独立的方法:

  • 创建初始化数据库的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/
    
    Run Code Online (Sandbox Code Playgroud)
  3. 构建您的docker镜像

    docker build -t mongo-sample-data:3.4 .
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

默认情况下,docker-entrypoint.sh会将您的脚本应用于test数据库; 上面的运行命令env var MONGO_INITDB_DATABASE=application将这些脚本应用于applicationdb.或者,您可以在js文件中创建并切换到不同的dbs.

我有一个github repo就是这样 - 这里是相关的文件.

  • 这不仅是答案,而且使使用docker-compose轻松实现即插即用。 (3认同)

Ber*_*ard 5

首先创建一个docker卷

docker volume create --name mongostore
Run Code Online (Sandbox Code Playgroud)

然后创建您的mongo容器

docker run -d --name mongo -v mongostore:/data/db mongo:latest
Run Code Online (Sandbox Code Playgroud)

-v这里交换机负责安装的卷mongostore/data/db的位置,这是在蒙戈保存其数据。该卷是持久的(在主机上)。即使没有容器在运行,您也会看到mongostore的卷列出为

docker volume ls
Run Code Online (Sandbox Code Playgroud)

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

初始化卷 Mongo将初始化一个新数据库(如果不存在)。这负责在mongostore中创建初始数据。假设您要使用预先播种的数据库创建全新的环境。问题在于如何在创建mongo容器之前将数据从本地环境(例如)传输到卷。我将列出两种情况。

  1. 当地环境

    您正在使用适用于Mac / Windows的Docker或Docker Toolbox。在这种情况下,您可以轻松地将本地驱动器安装到临时容器以初始化卷。例如:

    docker run --rm -v /Users/myname/work/mongodb:/incoming \
      -v mongostore:/data alpine:3.4 cp -rp /incoming/* /data
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 远程环境(AWS,GCP,Azure等)

    最好将其压缩/压缩以加快上传速度。

    tar czf mongodata.tar.gz /Users/myname/work/mongodb
    
    Run Code Online (Sandbox Code Playgroud)

    然后创建一个临时容器来解压缩并将文件复制到mongostore。在tail -f /dev/null刚刚可以确保容器不退出。

    docker run -d --name temp -v mongostore:/data alpine:3.4 tail -f /dev/null
    
    Run Code Online (Sandbox Code Playgroud)

    复制文件到它

    docker cp mongodata.tar.gz temp:.
    
    Run Code Online (Sandbox Code Playgroud)

    解压缩并移至该卷

    docker exec temp tar xzf mongodata.tar.gz && cp -rp mongodb/* /data
    
    Run Code Online (Sandbox Code Playgroud)

    清理

    docker rm temp
    
    Run Code Online (Sandbox Code Playgroud)

您也可以将文件复制到远程主机并从那里进行安装,但是我倾向于完全避免与远程主机进行交互。

免责声明 我是从内存中编写此文件的(没有测试)。


use*_*757 5

在mongo docker的最新版本中,类似这样的内容对我有效。

FROM mongo
COPY dump /home/dump
COPY mongo_restore.sh /docker-entrypoint-initdb.d/
Run Code Online (Sandbox Code Playgroud)

mongo恢复脚本如下所示。

#!/bin/bash
# Restore from dump
mongorestore --drop --gzip --db "<RESTORE_DB_NAME>" /home/dump
Run Code Online (Sandbox Code Playgroud)

您可以正常构建图像。

docker build -t <TAG> .
Run Code Online (Sandbox Code Playgroud)