Данные не сохраняются в базе данных при использовании MongoDB с объемами Docker? - PullRequest
3 голосов
/ 26 мая 2020

Есть сервис, использующий 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 Невозможно создать контейнер для службы mongodb: fa Чтобы смонтировать локальный том: mount / c / users / frol / mongodata / db : / mnt / sda1 / var / lib / d ocker / volume / test_mongodata / _data, flags: 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

Host - win 8.1, docker toolbox 19.03.1 установлен.
Помогите, пожалуйста, я новичок. Как убедиться, что данные базы данных не потеряны?

Ответы [ 3 ]

0 голосов
/ 26 мая 2020

Не устанавливать $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 совершенно не связаны. )

0 голосов
/ 26 мая 2020

Поскольку вы явно определяете каталог данных, вам необходимо отобразить тот же каталог в томе для сохранения данных

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
0 голосов
/ 26 мая 2020

Первая попытка сработает, если вы просто исправите простую опечатку в своем файле создания:

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/db - это значение по умолчанию MONGO_DATA_DIR, установка его довольно избыточна.


Но я бы предпочел использовать именованный том, так данные сохраняются, но мне не нужно видеть "уродливую" папку хранения базы данных:

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