Ste*_*ver 30
一种更独立的方法:
有许多答案使用一次性容器或创建卷并链接它们,但这似乎过于复杂.如果您查看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/
Run Code Online (Sandbox Code Playgroud)构建您的docker镜像
docker build -t mongo-sample-data:3.4 .
Run Code Online (Sandbox Code Playgroud)(可选)将图像推送到docker注册表以供其他人使用
运行您的泊坞窗图像
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卷
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容器之前将数据从本地环境(例如)传输到卷。我将列出两种情况。
当地环境
您正在使用适用于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)
这不适用于云存储。在这种情况下,您需要复制文件。
远程环境(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)您也可以将文件复制到远程主机并从那里进行安装,但是我倾向于完全避免与远程主机进行交互。
免责声明 我是从内存中编写此文件的(没有测试)。
在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)