this 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 Image,但不是MongoDB的官方Docker Image。
现在回答您的问题,
当其他方法不这样做时,为什么
/bin/bash
方法可以工作?
此答案基于Dockerfile v3.2。首先指出您的音量安装命令-v /usr/database
,本质上是在具有根所有权许可的容器中创建一个目录。
您下面的命令因permission denied
失败而失败,因为Docker映像以用户mongodb
运行(请参阅此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
进行了纠正(请参阅此Dockerfile Line)
$ docker run -v db:/data/db mongo:3.2
如何在docker-compose中复制这个原因?
最简单的解决方案是使用command: "mongod --dbpath=/data/db"
,因为在Dockerfile中已更正了权限所有权。
如果您打算使用主机量,则可能必须在主机OSX上添加mongodb
用户并更改适当的目录许可。修改音量安装座的许可所有权不在Docker-Compose的范围之外。