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

时间:2016-11-28 06:39:48

标签: mongodb macos docker docker-compose docker-volume

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中复制这个理由?
  3. 注意:在OSX上,因为这似乎会影响你是否可以将主机目录作为一个容器供Mongo使用 - 而不是我这样做。

1 个答案:

答案 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/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身份登录并以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的范围。