不能用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身份运行。
所以,我的问题是:
- 为什么
/bin/bash
方法工作,其他人不工作? - 如何在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镜像以用户mongodb
forms运行命令(请参阅此dockerfile行 )。 由于目录/usr/database
由root
拥有。
$ 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的范围之外。