我正在运行一个dockerized mongo容器。
我想用一些初始化数据创建一个mongo图像。
有什么想法吗?
答案 0 :(得分:28)
更独立的方法:
有许多答案使用一次性容器或创建卷并链接它们,但这似乎过于复杂。如果您查看mongo docker图像的docker-entrypoint.sh,您会看到第206行使用语法/docker-entrypoint-initdb.d/*.js
在初始化时执行mongo <db> <js-file>
个文件。如果您创建包含种子数据的派生MongoDB泊坞窗图像,则可以:
这种方法特别适合:
如何:
为派生图像创建一个Dockerfile,用于复制init脚本
FROM mongo:3.4
COPY seed-data.js /docker-entrypoint-initdb.d/
构建您的泊坞窗图片
docker build -t mongo-sample-data:3.4 .
(可选)将图像推送到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
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保存其数据的位置。卷是持久的(在主机上)。即使没有容器运行,您也会看到
docker volume ls
您可以杀死容器并创建一个新容器(与上面相同的行),新的mongo容器将获取上一个容器的状态。
初始化音量 如果没有,则Mongo初始化新数据库。这负责在mongostore中创建初始数据。假设您想使用预先播种的数据库创建一个全新的环境。问题变为如何在创建mongo容器之前将数据从本地环境(例如)传输到卷。我将列出两个案例。
本地环境
您正在使用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 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
您也可以将文件复制到远程主机并从那里安装,但我倾向于避免与远程主机进行交互。
声明。我是从记忆中写的(没有测试)。
答案 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文件中直接使用具有正确入口点设置的图像即可。干杯!