如何在 Docker 容器中运行的 Prometheus 中持久化数据?

Posted

技术标签:

【中文标题】如何在 Docker 容器中运行的 Prometheus 中持久化数据?【英文标题】:How to persist data in Prometheus running in a Docker container? 【发布时间】:2018-10-05 03:37:19 【问题描述】:

我正在开发一些需要 Prometheus 在重启之间保留其数据的东西。按照说明操作

$ docker volume create a-new-volume
$ docker run \
    --publish 9090:9090 \
    --volume a-new-volume:/prometheus-data \
    --volume "$(pwd)"/prometheus.yml:/etc/prometheus/prometheus.yml \
    prom/prometheus

我在主机的正确目录中有一个有效的prometheus.yml,Prometheus 正在从容器中读取它。目前我只是为了测试目的而抓取了几个 HTTP 端点。

但是当我重新启动容器时,它是空的,没有上次运行的数据。我的 docker run ... 命令将数据保存到 a-new-volume 卷中缺少什么?

【问题讨论】:

/prometheus 不是正确的数据目录吗? 是的!你的信息来源是什么? 这里:github.com/prometheus/prometheus/blob/master/Dockerfile 【参考方案1】:

使用默认数据目录,即/prometheus。为此,请使用此行而不是命令中的内容:

...
--volume a-new-volume:/prometheus \
...

在这里找到:https://github.com/prometheus/prometheus/blob/master/Dockerfile

令人惊讶的是image docs中没有提到

【讨论】:

当我这样做时,容器无法启动。我意识到这是因为主机上的目录权限。 为了省去别人弄清楚权限的麻烦:如果您使用绑定挂载来挂载主机目录:chown文件夹到nobody 或者chown 65534:65534 <volume-dir> 有一个拉取请求将此信息添加到官方安装文档:github.com/prometheus/prometheus/pull/8747【参考方案2】:

我今天遇到了同样的问题,但我使用的是 docker composer 文件。因此,总结了其他答案中的所有内容以及对我有用的内容。如果通过yaml compose file 设置 Prometheus docker...

首先在主机上为该卷创建一个文件夹,例如:

$ mkdir /tmp/prometheus

然后将文件夹所有者更改为nobody,例如(如果需要,使用sudo):

$ chown 65534:65534 /tmp/prometheus

然后在yaml配置文件中添加卷:

prometheus:
  image: prom/prometheus
  container_name: prometheus
  ports:
    - 9090:9090
  volumes:
    - /tmp/prometheus:/prometheus
    - ./prometheus.yml:/etc/prometheus/prometheus.yml

应该可以的。

【讨论】:

以上是关于如何在 Docker 容器中运行的 Prometheus 中持久化数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何将运行在 Docker 容器中的 Flyway 连接到运行在 Docker 容器中的数据库?

如何从另一个容器访问在 Docker 容器中运行的 Mopidy

如何在 docker 容器中运行 cron 作业

如何避免Docker容器启动脚本运行后自动退出

如何在 Heroku 中运行 Docker 容器

如何在 Docker 容器中运行 Kali Linux 2.0