Docker清除了mongoDB容器数据

3

我创建了一个程序并测试了它,运行正常。我决定将其Docker化,但似乎可能过了几个小时或几天后,mongoDB容器的数据全部被删除了。docker-compose.yml文件:

version: '3'
services:
  node:
    restart: always
    build: ./nodeServer
    container_name: nodeserver
    ports:
      - 5000:5000
    depends_on:
      - database
    networks:
      twitter_articles:
        ipv4_address: 172.24.0.2 
    environment:
      - TZ=Europe/Athens
  database:
    restart: always
    build: ./mongoDump/database
    container_name: mongodb
    ports:
      - 27017:27017
    networks:
      twitter_articles:
        ipv4_address: 172.24.0.4 
    volumes:
      - ./data:/data/db
    environment:
      - TZ=Europe/Athens
  pythonscript:
    restart: always
    build: ./python
    container_name: pythonscript
    depends_on:
      - database
    networks:
      twitter_articles:
        ipv4_address: 172.24.0.3 
    environment:
      - TZ=Europe/Athens
networks:
  twitter_articles:
    ipam:
      config:
        - subnet: 172.24.0.0/24

而且它们正在构建的三个 Dockerfile:

nodeserver:

FROM node:14.16.1

COPY package*.json ./
RUN npm install

COPY . ./

CMD [ "npm", "start"]

mongodb:

FROM mongo:5.0.3
CMD docker-entrypoint.sh mongod

Python 脚本

FROM python:3.9
COPY requirements.txt ./
RUN pip install -r requirements.txt
    
COPY . ./
    
CMD [ "python", "-u", "./init2.py" ]

如之前所述,没有使用Docker时,应用程序可以正常工作,数据库不会被清除。我还尝试了内部Docker存储,但结果相同。我尝试检查日志,发现每次数据库被清除时,pythonscript容器中都会发生错误。我知道pythonscript中应该会出现错误,但是在应用程序中没有任何代码执行集合或数据库的删除操作(即使没有使用Docker,此错误仍然会发生,但不会删除任何内容)。

有什么想法吗?


1
从docker-compose文件中,我看到您正在使用绑定挂载而不是卷。停止容器会删除绑定挂载。为了解决这个问题,请在网络数组后添加volumes数组,改用卷。 - Stephen Ng'etich
5个回答

5

您可以创建一个外部卷,并将mongoDB的数据添加到其中。这样即使在关闭docker-compose时,您的数据也不会被清除。

version: '3'
services:
  node:
    restart: always
    build: ./nodeServer
    container_name: nodeserver
    ports:
      - 5000:5000
    depends_on:
      - database
    networks:
      twitter_articles:
        ipv4_address: 172.24.0.2 
    environment:
      - TZ=Europe/Athens
  database:
    restart: always
    build: ./mongoDump/database
    container_name: mongodb
    ports:
      - 27017:27017
    networks:
      twitter_articles:
        ipv4_address: 172.24.0.4
    volumes: 
      - mongo_data:/data/db
    environment:
      - TZ=Europe/Athens
  pythonscript:
    restart: always
    build: ./python
    container_name: pythonscript
    depends_on:
      - database
    networks:
      twitter_articles:
        ipv4_address: 172.24.0.3 
    environment:
      - TZ=Europe/Athens
networks:
  twitter_articles:
    ipam:
      config:
        - subnet: 172.24.0.0/24
volumes:
  mongo_data:
    external: true

现在您需要使用以下命令在Docker中创建一个卷:

 docker volume create --name=mongo_data

接着运行docker-compose down命令

 docker-compose up --build -d

0

你需要为你的数据库创建一个持久化卷,因为正如你在docker-compose.yml文件中所指出的:

restart: always

每次你的Python脚本出错时,它会停止并依赖于Mariadb,因此它会重新启动并清除数据。

0
  1. 我会确保容器用户具有预配置的 ID,并具有对主机文件夹的写访问权限,以用于数据库数据持久化。
  2. 在 Docker 中映射持久化数据文件夹时,我也会在主机端使用绝对路径。

参考:

    volumes:
      - ./data:/data/db


0

我被建议在独立的卷之外保存数据,这总是更好的想法。请查看这个教程 volumes


0

确保数据存储在 Docker 容器之外,因为容器被视为牲畜而非宠物。新容器是全新创建的,不会包含上一个版本的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接