Docker 清除了 mongoDB 容器数据

Tha*_*kis 3 debugging mongodb docker dockerfile docker-compose

我创建了一个程序并进行了测试,效果很好。我决定对其进行 dockerize,似乎在几个小时或几天后,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
Run Code Online (Sandbox Code Playgroud)

以及它们构建的三个 Dockerfile:

节点服务器:

FROM node:14.16.1

COPY package*.json ./
RUN npm install

COPY . ./

CMD [ "npm", "start"]
Run Code Online (Sandbox Code Playgroud)

蒙戈数据库:

FROM mongo:5.0.3
CMD docker-entrypoint.sh mongod
Run Code Online (Sandbox Code Playgroud)

python脚本

FROM python:3.9
COPY requirements.txt ./
RUN pip install -r requirements.txt
    
COPY . ./
    
CMD [ "python", "-u", "./init2.py" ]
Run Code Online (Sandbox Code Playgroud)

正如之前提到的,如果没有 Docker,应用程序就可以正常工作,并且不会出现数据库被删除的情况。我也尝试过内部 Docker 存储,它也做同样的事情。我尝试检查日志,发现每次数据库擦除时 pythonscript 容器中都会发生错误。我知道 pythonscript 中应该会发生错误,但应用程序中的任何位置都没有这样的代码来执行集合或数据库的删除(即使没有 Docker,此错误仍然会发生,但不会删除任何内容)。

有任何想法吗?

mah*_*ori 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
Run Code Online (Sandbox Code Playgroud)

现在你必须使用以下命令在 docker 中创建一个卷

 docker volume create --name=mongo_data
Run Code Online (Sandbox Code Playgroud)

然后 docker-compose down 并

 docker-compose up --build -d
Run Code Online (Sandbox Code Playgroud)