我希望MongoDB容器使用主机json文件来创建数据库,一旦创建,mongo image的每个容器以后都可以共享它。我认为bind mount
和volume
可能有效,这些如下步骤表明我是如何处理的。
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
容器中,当我使用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
以及为什么我不能?
答案 0 :(得分:1)
警告(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文件本身。