如何使用docker镜像和docker-compose保留mongo db的默认数据和运行应用程序数据

时间:2018-12-18 16:20:47

标签: mongodb docker docker-compose dockerfile docker-volume

我必须使用一些默认集合和数据创建一个mongo图像。我可以通过引用以下链接使用此数据创建mongo图像:-

How to create a Mongo Docker Image with default collections and data?

因此,当我运行容器时,会得到默认数据。 现在,当我使用该应用程序时,会生成更多数据(通过调用API),这些数据将再次使用默认数据保存在mongodb中。

现在由于某种原因,如果重新启动docker容器,不幸的是,所有在运行时创建的数据都消失了,只剩下了默认数据。尽管我使用卷来保存数据。

那么,如何在每次重启docker时都保留运行时数据和默认数据? 我正在使用以下docker文件和docker-compose文件

Dockerfile:

FROM mongo
####### working isnerting data $##########
# Modify child mongo to use /data/db2 as dbpath (because /data/db wont persist the build)
RUN mkdir -p /data/db2 \
    && echo "dbpath = /data/db2" > /etc/mongodb.conf \
    && chown -R mongodb:mongodb /data/db2
COPY . /data/db2
RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db2 --smallfiles \
    &&  mongo 127.0.0.1:27017/usaa /data/db2/config-mongo.js \
    && mongod --dbpath /data/db2 --shutdown \
    && chown -R mongodb /data/db2
# Make the new dir a VOLUME to persists it 
VOLUME /data/db2
CMD ["mongod", "--config", "/etc/mongodb.conf", "--smallfiles"]

和docker-compose.yml的一部分

services:
  mongo:
    build: ./mongodb
    image: "mongo:1.2"
    container_name: "mongo"
    ports:
     - "27017:27017"
    volumes:
     - ${LOCAL_DIRECTORY}:/data/db2
    networks: 
      - some-network    

原因可能是,通过仅使用.js文件中定义的默认数据来重建docker image的创建/ data / db2目录。但不确定。

请更正我做错的事情,或针对此问题提出新的工作流程。

非常感谢!

1 个答案:

答案 0 :(得分:0)

因为默认情况下Docker是无状态的。每次调用docker run时,它都会重建容器。如果要保留一些数据,则有两种通用方法:

  1. 退出容器后不删除它。刚启动时,只需给容器起一个可爱的名字即可,例如docker run --name jessica mongo,然后在后续调用中使用docker start jessica

  2. 使用卷来存储数据并在容器之间共享。在这种情况下,您将使用诸如docker run -v /home/data:/data mongo之类的卷参数启动容器。另外,您将必须重新配置mongodb才能将数据保存在容器内的路径/data中。这种方法更容易,可用于在不同容器之间共享数据,以及为首次运行提供默认数据

UPD

使用docker-compose启动容器时,如果需要数据在会话之间保持不变,则可以使用预先创建的 external 卷。

首先创建一个卷,让我们说lovely

docker volume create lovely

然后在docker-compose.yml中使用它:

version: '3'
services:
  db1:
    image: whatever
    volumes:
      - lovely:/data
  db2:
    image: whatever
    volumes:
      - lovely:/data
volumes:
  lovely:
    external: true