Py学习  »  docker

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

Prakhar Patidar • 5 年前 • 2277 次点击  

我必须用一些默认的集合和数据创建一个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
 
2277 次点击  
文章 [ 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