【问题标题】:Permission error with mongo when running docker运行docker时mongo的权限错误
【发布时间】:2017-06-27 13:43:21
【问题描述】:

我的 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"

我得到权限错误:

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

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

如果我手动更改/data/db的权限,就会改回来。

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

【问题讨论】:

  • 主机中/data/db文件夹的权限是什么?应该由 root 拥有,因为 root 用户在 docker 容器中创建了这个文件夹。

标签: mongodb docker docker-compose


【解决方案1】:

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

setenforce 0

这不是 mongo 问题。这实际上是一个码头问题。当 docker 想要映射卷时,它会尝试更改权限,但对用户/组/selinux 限制执行失败。

更新:

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

【讨论】:

  • SELinux,在全球范围内浪费了数千小时的沉默罪魁祸首。感谢您提到 SELinux 人 :)
  • 像魅力一样工作!非常感谢
  • 感谢您救了我的命!
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2017-04-17
    • 2017-10-02
    相关资源
    最近更新 更多