如何使用docker镜像和docker compose持久化mongodb的默认数据和运行应用程序数据



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

如何使用默认集合和数据创建Mongo Docker镜像?

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

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

那么,如何在每次重新启动docker时保持运行时数据和默认数据呢?我正在使用以下docker文件和docker组成文件

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    

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

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

非常感谢!

因为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启动容器时,如果需要在会话之间保持数据,只需使用预先创建的外部卷即可。

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

最新更新