簡體   English   中英

將 MongoDB 與 Docker 卷一起使用時,數據未保留在數據庫中?

[英]Data isn't persisted in the database when using MongoDB with Docker volumes?

有一個使用 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 會寫入錯誤: ERROR: for test_mongodb_1 Cannot create container for service 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 工具箱 19.03.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 將其保留為默認值/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 的答案有效,因為它更改了綁定掛載的容器文件系統路徑以匹配環境變量中的容器文件系統路徑;主機./dockerdata和容器/dockerdata路徑完全不相關。)

當您明確定義數據目錄時,您需要 map 卷中的同一目錄以保留數據

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM