docker-compose 打开存储失败:运行时权限被拒绝错误

Posted

技术标签:

【中文标题】docker-compose 打开存储失败:运行时权限被拒绝错误【英文标题】:docker-compose opening storage failed: permission denied error on running 【发布时间】:2019-11-11 13:27:24 【问题描述】:

我正在尝试执行我的 docker-compose.yml 文件,其中包含 prometheus 和 grafana 配置。

这是我的docker-compose.yml 文件:

version: '2'
services:
  prometheus:
    image: prom/prometheus
    ports:
      - 9090:9090
    volumes:
      - /prometheus:/prometheus
    command: 
      - --config.file=/etc/prometheus/prometheus.yml 


  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    volumes:
      - /var/lib/grafana:/var/lib/grafana

每当我输入docker-compose -f docker-compose.yml up命令运行它时,我都会遇到这些关于权限的错误:

prometheus_1  | level=error ts=2019-06-30T16:14:42.690Z caller=main.go:723 err="opening storage failed: lock DB directory: open /prometheus/lock: permission denied" 
prometheus_1  | level=error ts=2019-06-30T16:26:11.897Z caller=main.go:723 err="opening storage failed: mkdir data/: permission denied"

我不知道如何解决这个问题,我已经搜索了 github 问题和其他 *** 的问题,但不幸的是它们都没有帮助!

【问题讨论】:

我对 prometheus 和 grafana 一无所知,但是,对我来说,这看起来像是您的音量问题。您将 prometheus 图像的数量设置为 /prometheus。因此,您应该检查您的用户是否为该目录设置了权限。 【参考方案1】:

如果您不需要从主机访问这些卷文件,请使用命名卷而不是主机挂载。 Docker会初始化命名卷的内容,包括权限和所有权,避免这样的权限问题:

version: '2'

volumes:
  prometheus:
  grafana:

services:
  prometheus:
    image: prom/prometheus
    ports:
      - 9090:9090
    volumes:
      - prometheus:/prometheus
    command: 
      - --config.file=/etc/prometheus/prometheus.yml 

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana:/var/lib/grafana

对于解决主机挂载权限问题的通用解决方案,可以使用我的docker-base 映像中的 fix-perms 脚本,以及入口点和容器启动方式的更改,以动态调整内部的用户 ID容器以匹配卷安装的容器。

【讨论】:

哇!我搜索了很多网站,但您的解决方案是最好的!非常感谢你 :) 【参考方案2】:

我的docker-compose up 命令不断返回以下内容:

err="opening storage failed: lock DB directory: open /prometheus/lock: permission denied"

问题是您本地计算机上的文件夹结构/文件具有不正确的文件权限,当启动 docker 容器时,它无法写入指定位置。

我通过使用以下命令递归地更改文件夹来解决此问题:

sudo chown -R nobody:nogroup <local path>

例如,我的 docker-compose.yml 中的卷部分如下所示:

volumes:
  - /home/user/docker-volumes/prometheus:/prometheus

冒号表示分隔本地文件路径:docker容器文件路径。应用我之前的 chown 示例会得到以下结果:

sudo chown -R nobody:nogroup /home/user/docker-volumes/prometheus

我的docker-compose up 不再因权限被拒绝而失败!

【讨论】:

是的,它有很大帮助。感谢您的评论克里斯蒂安! :*

以上是关于docker-compose 打开存储失败:运行时权限被拒绝错误的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose 环境中的 CORS 请求失败

docker-compose java 无法访问 jarfile

docker-compose up与docker-compose up -d

编程连接期间的 Docker-Compose 错误

io.FileNotFoundException:打开失败:EACCES(权限被拒绝)

Docker部署Docker-compose部署mysql容器及创建数据库失败问题