如何在不丢失 docker 数据的情况下更新 prometheus 配置文件

Posted

技术标签:

【中文标题】如何在不丢失 docker 数据的情况下更新 prometheus 配置文件【英文标题】:How I can update prometheus config file without losing data on docker 【发布时间】:2021-08-19 22:49:45 【问题描述】:

我有一个运行 prometheus 的 docker 容器,有时我必须更新容器内的配置文件,问题是我不知道我可以在不删除并再次创建容器的情况下更新此文件。

 docker run --network="host" -d --name=prometheus -p 9090:9090 -v ~/prometheus.yaml:/etc/prometheus/prometheus.yml  prom/prometheus --config.file=/etc/prometheus/prometheus.yml

我想知道如何在不删除并重新创建 docker 容器的情况下更新 prometheus.yaml

【问题讨论】:

【参考方案1】:

使用reload 网址

Prometheus 可以在运行时重新加载其配置。如果新配置格式不正确,则不会应用更改。通过向 Prometheus 进程发送 SIGHUP 或向 /-/reload 端点发送 HTTP POST 请求(启用 --web.enable-lifecycle 标志时)触发配置重新加载。这也将重新加载任何已配置的规则文件。

使用以下内容更改容器内的配置:

docker exec -it <container_name> sh

将配置映射到 docker 容器外部以进行持久性使用

-v <host-path>:<container_path>

【讨论】:

【参考方案2】:

理论上你不能,因为原则上容器是短暂的。这意味着它们应该在退出时一次性。但是,有几种方法可以摆脱困境:

#1。从您正在运行的容器中创建一个新图像:https://www.scalyr.com/blog/create-docker-image/ 以保持状态。

#2。如果选项 1 不适合您,则将您的数据从容器内复制到“外部世界”作为备份(以下是如何执行此操作的说明:https://linuxhandbook.com/docker-cp-example/)。您也可以登录到容器 (docker exec -it &lt;container-name&gt; bash),然后使用 yumapt install(取决于您的基础镜像)安装必要的工具来进行备份(rsync, ...),如果有时 very 准系统基础映像不提供这些。

#3。正如@Amir 已经提到的,您应该始终在 Container 内创建一个 Volume 并将其映射到外部世界以拥有持久的数据存储。您可以通过 Dockerfile 中的 VOLUME-Keyword 创建一个 Volume:https://docs.docker.com/storage/volumes/ ..这样,您可以在每次配置更改时重新启动容器,而不必担心数据丢失。

HTH

【讨论】:

【参考方案3】:

您应该在容器外 VOLUME Prometheus 的数据路径。 因此,如果容器再次创建,您可以拥有以前的数据。 Prometheus 的默认数据路径是 ./data 但在 docker 中它取决于您的基础映像。

【讨论】:

以上是关于如何在不丢失 docker 数据的情况下更新 prometheus 配置文件的主要内容,如果未能解决你的问题,请参考以下文章

在不丢失引用的情况下更新 ImmutableJS OrderedMap 上的记录

如何在不丢失“this”上下文的情况下从 React 组件中写入 apollo 缓存

如何在不丢失现有值的情况下编辑复选框

如何在不丢失原始参与者的情况下将现有呼叫升级到会议?

如何在不丢失数据的情况下返回我的父活动?

如何在不丢失当前页面的情况下重绘数据表