MongoDB стирает всякий раз, когда хост не работает - PullRequest
0 голосов
/ 07 октября 2018

У меня есть веб-API на Digital Ocean Droplet.Они недавно сделали обслуживание кластера, на котором мой API включен.После этого моя база данных очищается от всех данных.Это второй раз, когда это происходит в результате сбоя серверов.Проверяя файловую структуру, я заметил, что, кажется, есть дубликаты данных, вложенные на один уровень глубже. enter image description here

У меня такое чувство, что этот блок из docker compose может быть виновником.

mongo:
image: mongo:3.6
ports:
  - 27017:27017
volumes:
  - ./data/mongo:/data/db
networks:
  - my-api

Какие шаги я могу предпринять, чтобы решить эту проблему?

1 Ответ

0 голосов
/ 11 октября 2018

Вы определили bind mount (том) в относительном пути, который не рекомендуется.

./data/mongo:/data/db

Как указано creack в github гарантия не предоставляетсячто данные всегда находятся под таким путем.

Как?давайте предположим, что фактический путь к файлу составления /absolute/path/to/docker-compose.yml.Я изменяю каталог на /absolute/path/to/data/mongo и выполняю docker-compose -f ../../docker-compose.yml up -d.В этом случае my pwd ==> /absolute/path/to/data/mongo становится ., а Docker создает data/mongo, поскольку такая папка недоступна в этом месте.Это то, что произошло в вашем случае.

Здесь : - это разделитель для разделения пути хоста и пути док-станции.например: /host/path:/docker/path.Здесь каталог /host/path, который вы упомянули с левой стороны, связан как путь внутри Docker с правой стороны, то есть /docker/path.Путь к хосту и путь докера уже не нужно создавать.В таких случаях докер создает их в обоих местах.

Вы можете даже смонтировать том только для чтения, в таких случаях другое : используется в конце иro используется, чтобы пометить его как доступный только для чтения./host/path:/docker/path:ro.Здесь контейнер Docker может читать файлы только в /docker/path (косвенно /host/path) и не может ничего записывать в этом месте.

Помимо монтирования каталогов хоста, вы также можете монтировать томов данных таким же образом.
Существуют и другие типы томов, которые вы можете проверить в справочнике чтобы понять некоторые из них.Помимо них у вас также есть плагины, которые позволяют монтировать с расширенными функциями, такими как монтирование google drive, NFS, ...

Я рекомендую вам прочитать это , чтобы понять более сложные способы указаниятома в docker-compose.

Всегда рекомендуется указывать Абсолютный путь, поскольку он гарантирует местоположение.

Бонус

Вы также можете добавить restart:always к вашей композиции, так как это БД и онадолжен быть всегда. См. Это для других restart-policy вариантов.

Решение:

Итак, ваш файл составления докера должен быть

mongo:
image: mongo:3.6
ports:
  - 27017:27017
restart:unless-stopped
volumes:
  - /absolute/path/to/data/mongo:/data/db
networks:
  - my-api

Примечание. Добавление restart-policy также вызывает контейнер, если система перезагружается во время работы контейнера.Есть причина, по которой я не использовал restart:always.Я рекомендую вам найти его самостоятельно.

Ссылки:

  1. Использовать тома .
  2. Использовать крепления bind
  3. томов .
  4. Управление данными в Docker .
  5. Общие сведения о томах в Docker .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...