为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森王 2019-12-13 09:59:39
我正在尝试分发在几个链接的容器中运行的一组连接的应用程序,这些容器包括一个mongo数据库,该数据库需要:分发包含一些种子数据;允许用户添加其他数据。理想情况下,数据还将保存在链接的数据卷容器中。我可以mongo使用mongo不装载任何卷的基本实例(dockerhub映像:psychemedia/mongo_nomount-本质上是不带该VOLUME /data/db语句的基本mongo Dockerfile )和Dockerfile配置的方式将数据放入容器中:ADD . /filesWORKDIR /filesRUN 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其中与Dockerfile ./testdata.csv位于同一目录(./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用户指南建议:创建容器时将初始化卷。如果容器的基本映像在指定的安装点包含数据,则在卷初始化时将现有数据复制到新卷中?因此,如果我将VOLUME命令放在种子RUN命令之后,我希望数据能够持久保存吗?那我在做什么错?从长远来看,我想自动化几个链接容器的构建,然后分发一个Vagrantfile/ docker-compose的YAML文件,该文件将启动一组链接应用程序,其中包括一个预先mongo填充的数据库,该数据库带有(部分预先填充的)持久数据容器。
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

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


docker-compose.yml


mongodb:

  image: mongo

  ports:

    - "27017:27017"


mongo-seed:

  build: ./mongo-seed

  links:

    - mongodb


# my webserver which uses mongo (not shown in example)

webserver:

  build: ./webserver

  ports:

    - "80:80"

  links:

    - 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

  }

]


查看完整回答
反对 回复 2019-12-13
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

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


档案结构


.

├── docker-compose.yml

├── mongo

│   ├── data

│   ├── Dockerfile

│   └── init-db.d

│       └── seed.js

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


DOCKERFILE


FROM mongo:3.6


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

docker-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}}

seed.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脚本的脚本即可,createUser等等。


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


另外,最好确保您的密码和用户名不受Public的影响,不要将凭据推送到public git上,而应使用Docker Secrets。另请阅读本秘密教程


请注意,不必进入docker-swarm模式即可使用机密。撰写文件也支持秘密。检查一下


秘密也可以在MongoDB Docker Services中使用


查看完整回答
反对 回复 2019-12-13
?
FFIVE

TA贡献1797条经验 获得超6个赞

您可以使用Mongo Seeding Docker映像。


为什么?


您已经准备好使用Docker映像了

您不受JSON文件的束缚-还支持JavaScript和TypeScript文件(包括使用TypeScript进行的可选模型验证)

Docker Compose的示例用法:


version: '3'

services:

  database:

    image: 'mongo:3.4.10'

    ports:

    - '27017:27017'

  api:

    build: ./api/

    command: npm run dev

    volumes: 

    - ./api/src/:/app/src/

    ports:

    - '3000:3000'

    - '9229:9229'

    links:

    - database

    depends_on:

    - database

    - data_import

    environment: 

    - &dbName DB_NAME=dbname

    - &dbPort DB_PORT=27017 

    - &dbHost DB_HOST=database

  data_import:

    image: 'pkosiec/mongo-seeding:3.0.0'

    environment:

    - DROP_DATABASE=true

    - REPLACE_ID=true

    - *dbName

    - *dbPort

    - *dbHost

    volumes:

    - ./data-import/dev/:/data-import/dev/

    working_dir: /data-import/dev/data/

    links:

    - database

    depends_on:

    - database

免责声明:我是这个图书馆的作者。


查看完整回答
反对 回复 2019-12-13
  • 3 回答
  • 0 关注
  • 1065 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信