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

Can't start mongo with docker command, but can with /bin/bash inside container (with data 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 中复制这个原因?

注意:在 OSX 上,因为这似乎会影响您是否可以将主机目录挂载为卷以供 Mongo 使用 - 而不是我这样做。

澄清一下,此图像 hub.docker.com/_/mongo 是来自 DockerHub 的官方 MongoDB docker 图像,而不是来自 MongoDB 的官方 docker 图像。

现在回答你的问题,

Why does the /bin/bash method work, when the others do not?

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

您的以下命令因 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的身份登录并以root的身份执行mongod,并且有在/usr/database/中创建数据库文件的权限。

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

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

How can I replicate that reason, in the docker-compose?

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

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