不能用docker命令启动mongo,但是可以在容器内使用/ bin / bash(使用数据卷)

这个docker-compose.yml

 services: database: image: mongo:3.2 ports: - "27017" command: "mongod --dbpath=/usr/database" networks: - backend volumes: - dbdata:/usr/database volumes: dbdata: 

导致这个错误(剪切):

 database_1 | 2016-11-28T06:30:29.864+0000 I STORAGE [initandlisten] exception in initAndListen: 98 Unable to create/open lock file: /usr/database/mongod.lock errno:13 Permission denied Is a mongod instance already running?, terminating 

同样只是试图直接在使用该图像的容器中运行命令:

 $ docker run -v /usr/database mongo:3.2 mongod --dbpath=/usr/database 

但是,如果我启动容器时运行/bin/bash ,然后启动mongo ,我们就可以:

 $ docker run -it -v /usr/database mongo:3.2 /bin/bash root@8aab722fad89:/# mongod --dbpath=/usr/database 

基于输出,差异似乎是在第二种情况下,命令以root身份运行。

所以,我的问题是:

  1. 为什么/bin/bash方法工作,其他人不工作?
  2. 如何在docker-compose中复制这个原因?

注意:在OSX上,因为这似乎影响你是否可以将主机目录挂载为Mongo使用的卷 – 而不是我正在做这个。

为了澄清,这张图片hub.docker.com/_/mongo是来自DockerHub的官方MongoDB Docker镜像,但不是来自MongoDB的正式Docker镜像。

现在回答你的问题,

为什么/bin/bash方法工作,其他人不工作?

这个答案基于Dockerfile v3.2 。 首先要指出的是你的卷装入命令-v /usr/database ,本质上是在拥有root权限的容器中创build一个目录。

下面的命令失败, permission denied因为docker镜像以用户mongodbforms运行命令(请参阅此dockerfile行 )。 由于目录/usr/databaseroot拥有。

 $ docker run -v /usr/database mongo:3.2 mongod --dbpath=/usr/database 

而如果你执行下面的/bin/bash然后手动运行mongod

 $ docker run -it -v /usr/database mongo:3.2 /bin/bash 

您以root身份login并以root身份执行mongod ,并且具有在/usr/database/创build数据库文件的权限。

另外,如果你正在执行下面的代码行,这是因为你指向一个目录/data/db ,这个目录的权限已经被用户mongodb修改了(参见这个dockerfile行 )

 $ docker run -v db:/data/db mongo:3.2 

如何在docker-compose中复制这个原因?

最简单的解决scheme是使用command: "mongod --dbpath=/data/db"因为权限所有权已在Dockerfile中得到纠正。

如果您打算使用主机卷,则可能必须在主机OSX上添加mongodb用户,并更改适当的目录权限。 修改卷挂载的权限所有权在docker-compose的范围之外。