Docker无法通过仅包含数据的容器启动附加卷的MongoDb

我试图在我的Windows计算机上运行一个docker-compose ,启动一个MongoDB实例和一个代理包含数据库文件的数据专用容器。

 mongodata: image: mongo:2.6.8 volumes: - ./data/db:/data/db command: --break-mongo mongo: image: mongo:2.6.8 volumes_from: - mongodata ports: - "27017:27017" command: --smallfiles --rest 

* ps – – break-mongo命令是有目的的,因为它只需要创build卷

据我的理解,使用data-only卷模式将处理权限问题,但在Mongo容器启动期间,我可以看到以下错误:

  [0m2016-01-26T00:23:52.340+0000 [initandlisten] info preallocateIsFaster couldn't run due to: couldn't open file /data/db/journal/tempLatencyTest for writing errno:1 Operation not permitted; returning false [0m2016-01-26T00:23:52.341+0000 [initandlisten] Unable to remove temporary file due to: boost::filesystem::remove: Text file busy: "/data/db/journal/tempLatencyTest" [0m2016-01-26T00:23:52.344+0000 [initandlisten] exception in initAndListen: 13516 couldn't open file /data/db/journal/j._0 for writing errno:1 Operation not permitted, terminating 

因此,我无法使用MongoDb从本地机器连接卷。 有没有解决这个问题的方法?

文档说明

如果您在Mac或Windows上使用Docker Machine,则Docker守护程序对OS X或Windows文件系统的访问权限有限。 Docker机器尝试自动共享您的/ Users(OS X)或C:\ Users(Windows)目录。 所以,你可以在OS X上使用安装文件或目录。

docker run -v /Users/<path>:/<container path> ...

在Windows上,使用以下命令装载目录

docker run -v /c/Users/<path>:/<container path> ...

所有其他path来自您的虚拟机的文件系统。 例如,如果您正在使用VirtualBox某个可用于共享的其他文件夹,则需要执行额外的工作。 在VirtualBox的情况下,您需要将主机文件夹作为VirtualBox中的共享文件夹 。 然后,您可以使用Docker -v标志挂载它。

基本上,要么尝试从上面显示的C:\Users文件夹开始提供一个完整的path,要么如果你不能这样做,则使主机文件夹成为Virtualbox中的一个共享文件夹。

更新

没有必要给一个完整的path。 docker-compose将会处理这个。 您必须确保您docker-compose.yml位于Users文件夹的内部(在某处)。 它不能在一些根文件夹中。 如果你已经这样做,那么你将不得不调整你的权限。 只需给该文件夹的完全权限。

更新:查看最新的Docker for Windows和MacOS X。

更快,更可靠:不再需要VirtualBox! Docker引擎运行在Mac OS X上的xhyve虚拟机或Windows上的Hyper-V虚拟机上的Alpine Linux发行版上,该虚拟机由Docker应用程序pipe理。 你不需要docker-machine来运行Mac和Windows的Docker。

注意:如果是Windows,则需要Windows 10 Pro才能使其工作,因为Hyper-V不包含在其他版本中。

以前对于Docker Toolbox来说,由于VirtualBox的缘故,在Windows和OS X上似乎没有任何解决scheme。 图像文件确实指出 :

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

作为一个解决方法,我只是从mongo deamon开始之前的一个文件夹复制。 另外,在我的情况下,我不关心日记文件,所以我只复制数据库文件。

我已经在我的docker-compose.yml command: bash -c "(rm /data/db/*.lock && cd /prev && cp *.* /data/db) && mongod"使用了这个命令command: bash -c "(rm /data/db/*.lock && cd /prev && cp *.* /data/db) && mongod"并且每次在停止之前我使用的容器: docker exec <container_name> bash -c 'cd /data/db && cp $(ls *.* | grep -v *.lock) /prev'

注意:/ prev被设置为一个卷。 path/to/your/prev:/prev

另一个解决方法是使用mongodump和mongorestore。

  • 在docker-compose.yml中: command: bash -c "(sleep 30; mongorestore --quiet) & mongod"
  • 在terminal: docker exec <container_name> mongodump

注:我使用睡眠,因为我想确保mongo开始,这需要一段时间。

我知道这涉及到手动工作等,但是我很高兴至less得到了在我的Windows 10机器上运行的现有数据的mongo,并且当我需要时仍然可以在我的Macbook上工作。

(croscopy https://stackoverflow.com/a/42044756/1894856