如何使用docker-compose创build一个mongo数据库?

我试图分发一组连接的应用程序运行在几个链接的容器,其中包括一个需要:

  • 分发包含一些种子数据;
  • 允许用户添加额外的数据。

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

我可以使用mongo基础实例,不装载任何卷(dockerhub图像: psychemedia/mongo_nomount – 这实质上是没有VOLUME /data/db语句的基础mongo Dockerfile)和一个Dockerfileconfiguration行的:

 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./testdata.csv在同一个目录( ./mongo-with-data )中。

我的docker组成configuration文件包括以下内容:

 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它会replace当前的任何东西。

也就是说, docker用户指南build议: 当容器被创build时卷被初始化。 如果容器的基本映像包含指定安装点上的数据,那么在卷初始化时,现有数据将被复制到新卷中 ? 所以我希望如果在播种RUN命令之后放置VOLUME命令,数据将会持续存在?

那么我做错了什么?

长远来看,我想自动化几个链接容器的构build,然后分发一个Vagrantfile / Vagrantfile -compose YAML文件,这个文件将启动一组链接的应用程序,包括一个预先接种的mongo数据库,填充的)持久性数据容器。

我使用另一个docker集装箱来做这个,它的唯一目的就是种下孟戈,然后退出。 我怀疑这跟ebaxt是一样的,但是当我正在寻找这个答案的时候,我只是想看到一个快速而又简单的例子。 所以这里是我的:

泊坞窗,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 

蒙戈种子/ Dockerfile

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

蒙戈种子/ 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://ardoq.com/delightful-database-seeding-with-docker/

您可以使用此图像为许多作业提供docker容器(导入,导出,转储)

看看使用docker-compose的例子

回答我自己的问题:

  • 简单的YAML文件来创build链接到数据容器容器的简单的mongo容器,由Vagrant docker构build。
  • 在Vagrantfile中,代码大致如下:

config.vm.provision :shell, :inline => <<-SH docker exec -it -d vagrant_mongo_1 mongoimport --db a5 --collection roads --type csv --headerline --file /files/AADF-data-minor-roads.csv SH

导入数据。

打包盒子。

分配盒子。

对于用户来说,一个简单的Vagrantfile来加载这个盒子并运行一个简单的docker-compose YAML脚本来启动容器,并将mongo db安装在数据卷容器上。