2

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 使用 - 而不是我正在这样做。

4

1 回答 1

2

澄清一下,这个镜像  hub.docker.com/_/mongo是来自 DockerHub 的官方 MongoDB docker 镜像,但不是来自 MongoDB 的官方 docker 镜像。

现在回答你的问题,

为什么该 /bin/bash 方法有效,而其他方法无效?

此答案基于Dockerfile v3.2。首先要指出您的卷挂载命令-v /usr/database,本质上是在容器中创建一个具有 root 所有权权限的目录。

您的以下命令失败,permission denied因为 docker 映像正在以用户身份运行命令mongodb(请参阅此 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和执行mongod身份为root,并且具有在 中创建数据库文件的权限/usr/database/

此外,如果您正在执行下面的行,它会起作用,因为您指向的目录/data/db已为用户更正了权限mongodb(请参阅此 dockerfile 行

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

我怎样才能在 docker-compose 中复制这个原因?

最简单的解决方案是使用command: "mongod --dbpath=/data/db",因为已在 Dockerfile 中更正了权限所有权。

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

于 2016-11-29T01:19:47.360 回答