mongodb - 如何使用 docker-compose 为 mongo 数据库播种?

我正在尝试分发一组在多个链接容器中运行的连接应用程序,其中包括一个 mongo 数据库,该数据库需要:

  • 分发包含一些种子数据;
  • 允许用户添加其他数据。

理想情况下,数据也将保存在链接的数据卷容器中。

我可以使用不挂载任何卷的 mongo 基本实例将数据放入 mongo 容器(dockerhub 图像:psychemedia/mongo_nomount - 这本质上是基本的 mongo Dockerfile,没有 VOLUME/data/db 语句)和 Dockerfile 配置如下:

ADD . /files
WORKDIR /files
RUN mkdir -p /data/db && mongod --fork --logpath=/tmp/mongodb.log && sleep 20 && \
mongoimport  --db testdb --collection testcoll  --type csv --headerline --file ./testdata.csv  #&& mongod --shutdown

其中 ./testdata.csv 与 Dockerfile 位于同一目录 (./mongo-with-data)。

我的 docker-compose 配置文件包括以下内容:

mongo:
  #image: mongo
  build: ./mongo-with-data
  ports:
    - "27017:27017"
  #Ideally we should be able to mount this against a host directory
  #volumes:
  #  - ./db/mongo/:/data/db
  #volumes_from:
  #  - devmongodata

#devmongodata:
#    command: echo created
#    image: busybox
#    volumes: 
#       - /data/db

每当我尝试挂载 VOLUME 时,似乎原始种子数据(存储在 /data/db 中)被删除了。我想当一个卷安装到 /data/db 时,它会替换当前存在的任何内容。

也就是说,docker userguide建议:在创建容器时初始化卷。如果容器的基础镜像包含指定挂载点的数据,那么在卷初始化时将现有数据复制到新卷中?因此,如果我在播种 RUN 命令之后放置 VOLUME 命令,我希望数据会持续存在?

那我做错了什么?

长远来看,我想自动构建多个链接容器,然后分发一个 Vagrantfile/docker-compose YAML 文件,该文件将启动一组链接应用程序,其中包括带有(部分预填充的)持久数据容器的预播 mongo 数据库。

最佳答案

我使用另一个 docker 容器执行此操作,其唯一目的是播种 mongo,然后退出。我怀疑这与 ebaxt 的想法相同的,但是当我在寻找这个问题的答案时,我只是想看看一个快速而简单的例子。所以这是我的:

docker-compose.yml

mongodb:
  image: mongo
  ports:
    - "27017:27017"

mongo-seed:
  build: ./mongo-seed
  depends_on:
    - mongodb

# my webserver which uses mongo (not shown in example)
webserver:
  build: ./webserver
  ports:
    - "80:80"
  depends_on:
    - mongodb

mongo-seed/Dockerfile

FROM mongo

COPY init.json /init.json
CMD mongoimport --host mongodb --db reach-engine --collection MyDummyCollection --type json --file /init.json --jsonArray

mongo-seed/init.json

[
  {
    "name": "Joe Smith",
    "email": "jsmith@gmail.com",
    "age": 40,
    "admin": false
  },
  {
    "name": "Jen Ford",
    "email": "jford@gmail.com",
    "age": 45,
    "admin": true
  }
]

https://stackoverflow.com/questions/31210973/

相关文章:

regex - Mongo中不区分大小写的搜索

mongodb - 服务器在 SASL 身份验证步骤 : Authentication failed

mongodb - 将 MongoDB 集合的子集保存到另一个集合

node.js - 为什么建议不要在 Node.js 代码的任何地方关闭 MongoDB 连接?

mongodb - 如何在 MongoDB 中重命名集合?

mongodb - 在 mongodb 中使用 findOne 获取具有最大 id 的元素

mysql - 将数据库从 mysql 转换为 mongoDb

performance - MongoDB 'count()' 非常慢。我们如何改进/解决它?

mongodb - 对 mongodb 中的大量记录进行缓慢分页

performance - Mongodb聚合框架比map/reduce更快吗?