Как я могу использовать объем, чтобы сохранить мои mongodata? - PullRequest
0 голосов
/ 28 апреля 2018

Я хотел, чтобы контейнер MongoDB использовал json-файл хоста для создания базы данных, и после его создания каждый контейнер образа mongo позже может поделиться им. Я подумал, что bind mount и volume могут работать, эти следующие шаги показали, как с этим справился.

  • Сначала я смонтировал файл json doc_info_product.json и именованный том mymongo_data в mongo, имя контейнера образа монго, в этой структуре: docker run -d --name mongo --mount type=bind,source=V:\repository\How-to\doc_info_product.json,target=/data/db/doc_info.json -v mymongo_data:/data mongo:latest
  • Затем я выполняю mongo и использую mongoimport для создания базы данных с файлом json: docker exec -it mongo bash /# mongoimport --db mydb --collection doc --type json --file /data/db/doc_info.json --jsonArray
  • Теперь в контейнере mongo у меня было имя базы данных mydb и коллекция doc в нем при проверке с помощью show dbs и show collections.

  • Затем был установлен еще один контейнер под названием mongo2 mymongo_data: docker run -d -v mymongo_data:/data --name mongo2 mongo:latest

Но когда я проверил mongo2 и show dbs, я не получил mydb. Так как я могу получить mydb в другом контейнере и почему я не смог?

1 Ответ

0 голосов
/ 28 апреля 2018

РЕДАКТИРОВАТЬ: я первоначально ответил на это с точки зрения не монго, но теперь я понял, что это на самом деле проблема монго при использовании не Linux в качестве хоста: https://hub.docker.com/_/mongo/

ПРЕДУПРЕЖДЕНИЕ (Windows & OS X): настройка Docker по умолчанию в Windows и OS X использует виртуальную машину VirtualBox для размещения демона Docker. К сожалению, механизм VirtualBox, используемый для совместного использования папок между хост-системой и контейнером Docker, не совместим с файлами отображения памяти, используемыми MongoDB (см. Ошибку vbox, docs.mongodb.org и связанную ошибку jira.mongodb.org). Это означает, что невозможно запустить контейнер MongoDB с каталогом данных, сопоставленным с хостом.

Способ обойти это - использовать том докера вместо монтирования с хоста:

# Create a volume for persistent data
$ docker volume create mongodata
mongodata

# Start the mongo container, mount the db volume and
# also my downloads directory as a place to get a file to import
$ docker run -d --name mongo -v mongodata:/data/db \
  -v ~/Downloads/:/json mongo:latest
0755cc15f7550dce7fc4bef28da90216a95d5763df98518786533b6314c231d7

# Exec into the container and do the import
$ docker exec -it mongo bash
root@0755cc15f755 :/# mongoimport --db mydb --collection doc \
  --type json --file /json/test.json
2018-04-28T14:32:49.102+0000    connected to: localhost
2018-04-28T14:32:49.118+0000    imported 1 document

# Show the db is present and exit
root@0755cc15f755:/# mongo
> show dbs
admin  0.000GB
local  0.000GB
mydb   0.000GB
>
bye
root@0755cc15f755:/# exit

# After exiting the exec, stop the first container
$ docker stop mongo
mongo

# Start a new container using the same volume for data
$ docker run -d --name mongo2 -v mongodata:/data/db mongo:latest
b6bda766217c6fe4ed355c1faaa5880471b6841eb68c8dd75a3cb72aa5c39ff5

# Exec into this
$ docker exec -it mongo2 bash

# Show the data is still there!
root@b6bda766217c:/# mongo
> show dbs
admin  0.000GB
local  0.000GB
mydb   0.000GB

Это ваша лучшая ставка, учитывая, что вы не на родном Linux.

ПРЕДУПРЕЖДЕНИЕ: Я не знаю достаточно о Монго, чтобы точно знать, что произойдет, но в целом запуск двух баз данных одновременно с одним и тем же каталогом данных - действительно плохая идея. Монго может использовать блокировку в /data/db и обнаруживать, что это происходит, и действовать соответствующим образом, а может и нет. Поэтому, если вы задумывались об этом, всегда лучше быть явным, убедитесь, что у всех, кроме одного из контейнеров, есть каталог данных, смонтированный только для чтения . Вы можете сделать это, добавив :ro в конец монтирования тома, например -v mongodata:/data/db:ro.

Кроме того: у меня нет доступа к окнам, чтобы проверить это, но я также заметил, что есть проблема с монтированием файла в контейнер, который вы делаете с вашим файлом JSON. Я думаю, что это приведет к пустому монтированию тома в контейнере. Поэтому вместо этого сделайте, как я, и смонтируйте каталог, содержащий ваши файлы JSON, а не сам файл JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...