【问题标题】:Data isn't persisted in the database when using MongoDB with Docker volumes?将 MongoDB 与 Docker 卷一起使用时,数据不会保留在数据库中吗?
【发布时间】:2020-09-13 17:03:22
【问题描述】:

有一个使用 mongodb 的服务。但是当我重新启动计算机或 docker 机器时,数据库中没有存储任何数据。 docker-compose.yml:

version: "3"
Services:
...
  mongodb:
    restart: always
    image: mongo:latest
    environment:
      - MONGO_DATA_DIR=/dockerdata/db
    volumes:
        - ./dockerdata/db:/data/db
    ports:
      - 27017:27017
    command: mongod

我尝试在主机上做数据库存储,但也没有用:

docker-compose.yml:

version: "3"
Services:
...
  mongodb:
    restart: always
    image: mongo:latest
    environment:
      - MONGO_DATA_DIR=/c/users/frol/mongodata/db
    volumes:
        - /c/users/frol/mongodata/db:/data/db
    ports:
      - 27017:27017
    command: mongod

如果你创建了一个命名卷,docker 会写一个错误: 错误:对于 test_mongodb_1 无法为服务 mongodb 创建容器:fa 挂载本地卷: mount /c/users/frol/mongodata/db:/mnt/sda1/var/lib/d ocker/volumes/test_mongodata/_data,标志:0x1000:没有这样的文件或目录

docker-compose.yml:

version: "3"
services:
...
  mongodb:
    restart: always
    image: mongo:latest
    environment:
      - MONGO_DATA_DIR=/c/users/frol/mongodata/db
    volumes:
        - mongodata:/data/db
    ports:
      - 27017:27017
    command: mongod 
volumes:
  mongodata:
    driver: local
    driver_opts:
      type: none
      device: /c/users/frol/mongodata/db
      o: bind

主机 - win 8.1,安装 docker toolbox 19.03.1。
请帮帮我,我是新手。如何确保数据库数据不丢失?

【问题讨论】:

    标签: windows mongodb docker docker-compose


    【解决方案1】:

    如果您只是在撰写文件中修复一个简单的拼写错误,那么您的第一次尝试会奏效:

    version: "3"
    services:
    ...
      mongodb:
        restart: always
        image: mongo:latest
        environment:
          - MONGO_DATA_DIR=/data/db  # changed
        volumes:
            - ./dockerdata/db:/data/db
        ports:
          - 27017:27017
        command: mongod
    

    但是,由于/data/dbMONGO_DATA_DIR 的默认值,所以设置它是相当多余的。


    但我更喜欢使用命名卷,这样数据会持续存在,但我不必看到“丑陋”的数据库存储文件夹:

    version: "3"
    services:
    ...
      mongodb:
        restart: always
        image: mongo:latest
        volumes:
            - mongodata:/data/db
        ports:
          - 27017:27017
        command: mongod 
    volumes:
      mongodata:
    

    【讨论】:

    • 感谢您的帮助! MONGO_DATA_DIR 已清理,但不幸的是它没有帮助。它也不适用于命名卷,出现相同的错误。错误:对于 mongodb 无法为服务 mongodb 创建容器:无法挂载本地卷:挂载 /dockerdata/db:/data/db:/mnt/sda1/var/lib/docker/volumes/test_mongodata/_data,标志:0x1000:否这样的文件或目录
    • mongodb: restart: always image: mongo:latest volumes: - mongodata:/data/db ports: - 27017:27017 volumes: mongodata: driver: local driver_opts: type: none device: ./dockerdata/db:/data/db o: bind
    • @Olga 尝试使用我答案底部的确切 docker-compose 文件。不要将 driverdevicetype 内容添加到卷部分。
    • @Olga 还要检查您是否遵循了这些说明中的第 1-3 点:rominirani.com/…
    【解决方案2】:

    当您明确定义数据目录时,您需要在卷中映射相同的目录以持久化数据

    version: "3"
    services:
    ...
      mongodb:
        restart: always
        image: mongo:latest
        environment:
          - MONGO_DATA_DIR=/data/db #data directory
        volumes:
            - ./dockerdata/db:/data/db #same data directory which you defined above
        ports:
          - 27017:27017
        command: mongod
    

    【讨论】:

    • 不幸的是,它没有帮助。重启后数据丢失。
    【解决方案3】:

    不要设置$MONGO_DATA_DIR;将其保留为默认的/data/db

    services:
      mongodb:
        restart: always
        image: mongo:latest
        # No need to specifically set $MONGO_DATA_DIR
        volumes:
          - ./dockerdata/db:/data/db
        ports:
          - 27017:27017
        # No need to override command:
    

    Docker 容器有一个独立于宿主文件系统的文件系统空间。大多数数据库的典型设置是将数据库存储在容器内的固定位置;对于 MongoDB,这是 /data/db 目录。您可以在那里挂载一个命名卷或文件系统路径,但容器内的代码不知道其中的区别。

    如果你确实设置了像$MONGO_DATA_DIR这样的环境变量,它们需要反映容器内的路径;他们不能直接指定主机系统路径。 (@ruohola 的 answer 之所以有效,是因为它更改了绑定挂载的容器文件系统路径以匹配环境变量中的容器文件系统路径;主机 ./dockerdata 和容器 /dockerdata 路径完全不相关。)

    【讨论】:

    • 不幸的是,它没有帮助。重启后数据丢失。
    • 感谢您的帮助和解释!
    猜你喜欢
    • 2019-09-04
    • 2021-11-29
    • 2020-07-15
    • 1970-01-01
    • 2021-09-11
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多