社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

如何使用docker镜像和docker compose持久化mongo db的默认数据和运行app数据

Prakhar Patidar • 5 年前 • 2245 次点击  

我必须用一些默认的集合和数据创建一个mongo映像。我可以通过以下链接使用这些数据创建Mongo映像:

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

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

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

那么,每次Docker重启时,如何持久化运行时数据和默认数据呢? 我正在使用下列docker文件和docker compose文件

文档文件:

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映像的creating/data/db2目录。但不确定。

请纠正我做错了什么,或者为这个问题建议一个新的工作流程。

非常感谢!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47119
 
2245 次点击  
文章 [ 1 ]  |  最新文章 5 年前
grapes
Reply   •   1 楼
grapes    6 年前

因为Docker在默认情况下是无状态的。每次你打电话 docker run 它重建了容器。如果要保留某些数据,有两种常规方法:

  1. 容器离开后不能取出。刚开始的时候给你的容器起个可爱的名字,比如 docker run --name jessica mongo 然后,在随后的通话中,使用 docker start jessica

  2. 使用卷存储数据并在容器之间共享。在本例中,您将使用卷参数启动容器,如 docker run -v /home/data:/data mongo .另外,您还必须重新配置 mongodb 在路径中保存数据 /data 在集装箱里。这种方法更简单,可用于在不同容器之间共享数据,以及为第一次运行提供默认数据

升级版

使用时 docker-compose 要启动容器,如果需要在会话之间持久化数据,只需使用 外部的 卷,这是您预先创建的。

首先创建卷,比方说 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