Вы определили 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
.Я рекомендую вам найти его самостоятельно.
Ссылки:
- Использовать тома .
- Использовать крепления bind
- томов .
- Управление данными в Docker .
- Общие сведения о томах в Docker .