如何在 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 容器中的数据库?