如何使用 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 用户指南建议: _在创建容器时初始化卷。如果容器的基础镜像包含指定挂载点的数据,那么现有数据会在卷初始化时复制到新卷中_?因此,如果我在播种 RUN 命令之后放置 VOLUME 命令,我希望数据会持续存在?

那么我做错了什么?

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

原文由 psychemedia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 400
2 个回答

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

码头工人-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
  }
]

原文由 Jeff Fairley 发布,翻译遵循 CC BY-SA 4.0 许可协议

我发现使用 Docker 自定义映像和使用卷很有用,而不是创建另一个容器进行播种。

文件结构

.
├── docker-compose.yml
├── mongo
│   ├── data
│   ├── Dockerfile
│   └── init-db.d
│       └── seed.js

Dockerfile / docker-compose.yml 中提到的每个文件位置都相对于 docker-compose.yml 的位置

码头工人文件

FROM mongo:3.6

COPY ./init-db.d/seed.js /docker-entrypoint-initdb.d

码头工人-compose.yml

 version: '3'

services:
  db:
    build: ./mongo
    restart: always
    volumes:
      - ./mongo/data:/data/db #Helps to store MongoDB data in `./mongo/data`
    environment:
      MONGO_INITDB_ROOT_USERNAME: {{USERNAME}}
      MONGO_INITDB_ROOT_PASSWORD: {{PWD}}
      MONGO_INITDB_DATABASE: {{DBNAME}}

种子.js

 // Since Seeding in Mongo is done in alphabetical order... It's is important to keep
// file names alphabetically ordered, if multiple files are to be run.

db.test.drop();
db.test.insertMany([
  {
    _id: 1,
    name: 'Tensor',
    age: 6
  },
  {
    _id: 2,
    name: 'Flow',
    age: 10
  }
])

docker-entrypoint-initdb.d 可用于创建不同的用户和mongodb管理相关的东西,只需创建一个按字母顺序命名 的js-script到 createUser 等…

有关如何自定义 MongoDB Docker 服务的更多详细信息,请阅读

此外,最好保护您的密码和用户名不受公共的影响, 不要在公共 git 上推送凭据,而是使用 Docker Secrets 。另请阅读此 关于秘密的教程

请注意,无需进入 docker-swarm 模式 即可使用机密。 Compose Files 也支持机密。检查 这个

Secrets 也可以在 MongoDB Docker 服务 中使用

原文由 phoenisx 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题