【问题标题】:How to persist default data and running app data of mongo db with docker images and docker-compose如何使用 docker images 和 docker-compose 持久化 mongo db 的默认数据和运行应用程序数据
【发布时间】:2019-05-19 02:46:51
【问题描述】:

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

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

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

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

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

Docker 文件:

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    

原因可能是,通过重建 docker 映像,它创建的 /data/db2 目录仅包含 .js 文件中定义的默认数据。但不确定。

请纠正我做错的地方或为这个问题建议一个新的工作流程。

非常感谢!

【问题讨论】:

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


    【解决方案1】:

    因为 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
    

    【讨论】:

    • 感谢@grapes 的快速建议。我正在使用 docker-compose up & down 所以它也会删除容器,所以第一个选项在这里不是一个好的解决方案。我正在遵循第二点中提到的方法。我已经创建了 /data/db2 文件夹并配置了 mongo 以将数据保存在 /data/db2 中,但我还安装了与我的文件夹系统相同的目录以保留数据更改。这也有效。但是当再次组合被触发时,它删除了保存在 ${LOCAL_DIRECTORY} 中的所有数据。所以所有的运行时数据都消失了。
    • VOLUME /data/db2 那么docker文件中的这个命令会删除所有以前存储的挂载数据吗?应该不对吧?
    猜你喜欢
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多