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



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。

运行。

所以,我的问题是:

  1. 当其他方法不这样做时,为什么/bin/bash方法可以工作?
  2. 在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/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并执行mongodroot,并且有权在/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的范围之外。

最新更新