我如何使用音量来保持我的蒙古语?

时间:2018-04-28 08:53:36

标签: json mongodb docker

我希望MongoDB容器使用主机json文件来创建数据库,一旦创建,mongo image的每个容器以后都可以共享它。我认为bind mountvolume可能有效,这些如下步骤表明我是如何处理的。

  • 首先,我在此结构中将json文件doc_info_product.json和命名卷mymongo_data挂载到mongo,即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容器中,当我使用mydbdoc进行检查时,我的数据库名称为show dbs,其中包含show collections集合

  • 然后另一个名为mongo2的容器已经安装了mymongo_data docker run -d -v mymongo_data:/data --name mongo2 mongo:latest

但是当我选中mongo2show dbs时,我没有得到mydb。那么我如何在另一个容器中获取mydb以及为什么我不能?

1 个答案:

答案 0 :(得分:1)

编辑:我最初是从非mongo特定的角度回答这个问题,但我现在意识到当使用非Linux作为主机时,它实际上是一个mongo特定问题:https://hub.docker.com/_/mongo/

  

警告(Windows和OS X):Windows和OS X上的默认Docker设置使用VirtualBox VM来托管Docker守护程序。不幸的是,VirtualBox用于在主机系统和Docker容器之间共享文件夹的机制与MongoDB使用的内存映射文件不兼容(请参阅vbox bug,docs.mongodb.org和相关的jira.mongodb.org错误)。这意味着无法运行映射到主机的数据目录的MongoDB容器。

解决这个问题的方法是使用docker卷而不是来自主机的mount:

# 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上,这是您最好的选择。

警告:我对mongo了解不足以确定会发生什么,但一般情况下,同一个数据目录同时运行两个数据库是一个非常糟糕的主意。 mongo可能会在/data/db中使用锁定并检测到这种情况正在发生并相应地采取行动,或者可能不会。因此,如果您考虑这样做,最好是明确的,请确保除了一个容器之外的所有容器都安装了只读数据目录。您可以通过将:ro附加到卷装入的末尾来执行此操作,例如。 -v mongodata:/data/db:ro

另外:我没有访问Windows来测试这个,但我也有一个问题,即将文件挂载到容器中,这就是你对JSON文件所做的事情。我认为这会导致容器中的空卷安装。所以请像我一样,安装包含JSON文件的目录,而不是JSON文件本身。