Mongodb Can';不能使用docker命令启动mongo,但可以在容器内使用/bin/bash(使用数据卷)

Mongodb Can';不能使用docker命令启动mongo,但可以在容器内使用/bin/bash(使用数据卷),mongodb,macos,docker,docker-compose,docker-volume,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: 导致此错误的原因(被剪断): 对于直接使用

docker compose.yml

services:
  database:
    image: mongo:3.2
    ports:
      - "27017"
    command: "mongod --dbpath=/usr/database"
    networks:
      - backend
    volumes:
      - dbdata:/usr/database

volumes:
  dbdata:
导致此错误的原因(被剪断):

对于直接使用该图像在容器中运行命令,同上:

$ 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使用的卷—我不是这样做的。

    为了澄清,此图像是DockerHub的官方MongoDB docker图像,但不是MongoDB的官方docker图像

    现在回答大家的问题,

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

    这个答案是基于。首先要指出的是,您的卷装载命令
    -v/usr/database
    ,实际上是在容器中创建一个具有root所有者权限的目录

    下面的命令失败,权限被拒绝,因为docker映像正在以用户
    mongodb
    的身份运行该命令(请参阅)。因为目录
    /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
    身份登录并以
    root
    身份执行
    mongod
    ,并且它有权在
    /usr/database/
    中创建数据库文件

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

    我如何在docker compose中复制这个原因

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


    如果您打算使用主机卷,可能需要在主机OSX上添加
    mongodb
    user并更改相应的目录权限。修改卷装载的权限所有权超出的范围

    因此,这并没有回答我的问题,但确实解决了我的根本问题:
    docker run-v db:/data/db mongo:3.2
    你的
    Dockerfile
    对于image
    mongo:3.2
    包含什么?如果在文件末尾使用了
    ENTRYPOINT
    mongod
    ,则您将docker start命令加倍。
    mongo:3.2
    是官方的mongo映像。我没有成功。你有没有在docker compose或类似的东西中尝试过
    命令:“/bin/bash-c'mongod--dbpath=/usr/database”
    ?没有内部记号-这可能是我缺少的。好吧,我想这是我(非常好,谢谢)的答案。为了澄清,如果我想在图像中使用
    /data/db
    以外的位置,我需要制作一个其他位置具有正确权限的图像?正确,如果你想在图像(内部)中使用
    /data/db
    以外的位置,你需要修改
    mongodb
    用户的权限。如果要使用映像外部的位置(即主机卷),则需要在主机上添加用户
    mongodb
    ,然后映射权限(guid),以便容器的
    mongodb
    用户能够使用该外部卷。
    $ docker run -it -v /usr/database mongo:3.2 /bin/bash
    
    $ docker run -v db:/data/db mongo:3.2