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

76

我正在开发一个需要 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卷中?


2
“/prometheus” 不是正确的数据目录吗? - Robert
1
是的!你得到这个信息的来源是什么? - Matt
请在此处查看:https://github.com/prometheus/prometheus/blob/master/Dockerfile - Robert
2个回答

115

使用默认数据目录,即/prometheus。为此,请使用以下行替换您命令中的内容:

 --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus 

请注意,您需要将--storage.tsdb.path设置为默认数据目录/prometheus

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

发现于:https://github.com/prometheus/prometheus/blob/master/Dockerfile

令人惊讶的是,在 镜像文档 中没有提到。


1
当我这样做时,容器无法启动。我意识到这是因为主机上目录的权限问题。 - ibrahim
29
为了避免让其他人费力地弄明白权限问题:如果你正在使用绑定挂载来挂载主机目录:将文件夹的所有者更改为 nobody - yegle
23
或者使用命令 chown 65534:65534 <volume-dir>,其中 <volume-dir> 是卷目录的路径。 - Sathesh
7
有一个拉取请求,旨在将此信息添加到官方安装文档中:https://github.com/prometheus/prometheus/pull/8747 - wobmene
那个公关终于合并了!(超过2年之后) - Matt

19

今天我遇到了同样的问题,但我使用的是docker组合文件。因此,将其他答案评论中的所有内容和对我有效的内容进行总结。如果通过yaml组合文件设置Prometheus docker......

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

$ mkdir /tmp/prometheus

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

然后将文件夹所有权更改为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

就这样做吧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接