Docker无法通过仅数据容器

时间:2016-01-26 00:33:56

标签: mongodb docker storage docker-compose

我尝试在我的 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

* P.S。 --break-mongo命令是有目的的,因为它只需要创建卷

据我了解,使用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与我本地计算机上的附加卷一起使用。有没有解决这个问题的方法?

3 个答案:

答案 0 :(得分:1)

documentation

  

如果您在Mac或Windows上使用Docker Machine,则使用Docker守护程序   只能有限地访问您的OS X或Windows文件系统。搬运工人   机器尝试自动共享您的/用户(OS X)或C:\ Users(Windows)   目录。因此,您可以使用。

在OS X上挂载文件或目录      

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

     

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

     

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

     

所有其他路径都来自虚拟机的文件系统。例如,如果你是   使用VirtualBox可以分享其他一些文件夹,你需要   做额外的工作。 在VirtualBox的情况下,您需要制作   主机文件夹可用作VirtualBox中的共享文件夹。然后你可以   使用Docker -v标志挂载它。

基本上,如果您尝试从C:\Users文件夹开始提供完整路径,如上所示,或者如果您不能这样做,请将主机文件夹设置为Virtualbox中的共享文件夹。

<强>更新

无需提供完整的路径。 docker-compose会处理这个问题。您必须确保docker-compose.yml文件夹内的Users位于内部(某处)。它不能在某个根文件夹中。如果您已经这样做了,那么您将不得不调整您的权限。只需为该文件夹授予完全权限。

答案 1 :(得分:0)

更新:查看latest Docker for Windows and MacOS X

  

更快更可靠:不再有VirtualBox! Docker引擎是   在xhyve Virtual上运行Alpine Linux发行版   适用于Mac OS X或Windows上的Hyper-V VM,以及该VM   由Docker应用程序管理。你不需要docker-machine   运行Docker for Mac和Windows。

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

对于以前的Docker Toolbox,由于VirtualBox,似乎在Windows和OS X上根本没有解决方案。图像文档确实states

  

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

答案 2 :(得分:0)

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

我在docker-compose.yml上使用过这个命令 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。

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

注意:我使用sleep是因为我想确保mongo启动,并且需要一段时间。

我知道这涉及到手工作业等,但我很高兴至少我在我的Windows 10机器上运行了现有数据的mongo,并且在我想要的时候仍可以使用我的Macbook。

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