运行docker时mongo权限错误

Joe*_*Joe 5 mongodb docker docker-compose

我的码头工人组成:

version: "2"
services:
 api:
    build: .
    ports:
      - "3007:3007"
    links:
      - mongo
    volumes:
      - .:/opt/app
  mongo:
    image: mongo
    volumes:
      - /data/db:/data/db
    ports:
      - "27017:27017"
Run Code Online (Sandbox Code Playgroud)

我得到权限错误:

mongo_1          | chown: changing ownership of '/data/db/diagnostic.data/metrics.2017-06-27T13-32-30Z-00000': Operation not permitted
mongo_1          | chown: changing ownership of '/data/db/journal/WiredTigerLog.0000000054': Operation not permitted
mongo_1          | chown: changing ownership of '/data/db/journal/WiredTigerPreplog.0000000001': Operation not permitted
mongo_1          | chown: changing ownership of '/data/db/journal/WiredTigerPreplog.0000000002': Operation not permitted
mongo_1          | chown: changing ownership of '/data/db/WiredTiger.turtle': Operation not permitted
mongo_1          | chown: changing ownership of '/data/db/WiredTigerLAS.wt': Operation not permitted
Run Code Online (Sandbox Code Playgroud)

ls-la 关于数据:

ls -la data
total 0
drwxrwxrwx    3 root  wheel   102 Dec  1  2016 .
drwxr-xr-x   35 root  wheel  1258 Jun 25 04:29 ..
drwxrwxrwx@ 118 root  wheel  4012 Jun 27 15:33 db
Run Code Online (Sandbox Code Playgroud)

如果我手动更改 的权限/data/db,它将被更改回来。

这里有什么问题?如果我在本地运行 mongo 没有问题。

saj*_*adG 7

我在 CentOS 中遇到了这个问题,解决方案是打开 SELinux:

setenforce 0
Run Code Online (Sandbox Code Playgroud)

这不是蒙戈问题。这实际上是一个 docker 问题。当 docker 想要映射卷时,它会尝试更改权限,但未能对用户/组/selinux 限制进行操作。

更新:

entrypoint.sh 中有一个 chown 命令,它尝试更改映射卷中目录和文件的权限。在这里阅读更多。


Mii*_*gic 5

只有 root 或 sudo 组的成员才能更改文件/目录的所有权。当您在 docker 中运行 mongodb 并从主机附加卷时,mongo 会尝试以 mongod 用户身份运行。由于该用户在您的主机上不存在,并且 root 拥有该卷,因此 mongod/docker 试图拥有该卷,因此操作系统将其视为权限问题,您将看到该错误。您有几个选择:

  1. 通过编辑 mongo 配置并在 docker 构建过程中复制它,将 mongo 配置为以 root 身份运行。这假设您使用 docker 文件来构建该映像。然后访问附加卷就不会出现问题。

  2. 在主机上创建一个 mongod 用户和组,并将数据目录的所有权更改为该用户,操作系统在所有权/权限方面没有区别。

  3. 重新架构您的系统,以便 mongo 可以在其生命周期中使用默认的容器数据存储大小,并完全放弃卷安装。