这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
方法有效,而其他方法没有?注意:在OSX上,因为这似乎会影响你是否可以将主机目录作为一个容器供Mongo使用 - 而不是我这样做。
答案 0 :(得分:2)
为了澄清,此图像hub.docker.com/_/mongo是来自DockerHub的官方MongoDB泊坞窗图像,但不是来自MongoDB的官方泊坞窗图像。
现在回答你的问题,
为什么
/bin/bash
方法有效,而其他方法没有?
此答案基于Dockerfile v3.2。首先要指出的是,您的卷装入命令-v /usr/database
实际上是在容器中使用root所有权权限创建一个目录。
下面的命令因permission denied
而失败,因为docker镜像以用户mongodb
运行命令(请参阅this dockerfile line)。由于目录/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
身份登录并以mongod
身份执行root
,并且拥有在/usr/database/
中创建数据库文件的权限。
此外,如果您正在执行下面的行,那么它会起作用,因为您指向的目录/data/db
已为用户mongodb
更正了权限(请参阅this dockerfile line)
$ docker run -v db:/data/db mongo:3.2
我如何在docker-compose中复制这个原因?
最简单的解决方案是使用command: "mongod --dbpath=/data/db"
,因为Dockerfile中的权限所有权已得到纠正。
如果您打算使用主机卷,则可能必须在主机OSX上添加mongodb
用户并更改相应的目录权限。修改卷装入的权限所有权超出了docker-compose的范围。