使用docker部署Prometheus的坑
compose
services:
prometheus:
container_name: prometheus
image: prom/prometheus:v3.2.1
restart: always
ports:
- "9090:9090"
environment:
TZ: UTC
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- ./rules:/etc/prometheus/rules
- ./custom-rules:/etc/prometheus/custom-rules
- /data/monitoring/prometheus-data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.max-block-duration=2h'
- '--storage.tsdb.min-block-duration=2h'
- '--web.enable-lifecycle'
- '--web.enable-remote-write-receiver'
- '--storage.tsdb.retention.time=30d'
其中可以看到我们能将 ./prometheus.yml 挂载到容器内的 /etc/prometheus/prometheus.yml 应该所有人都能够理解。
需求
./prometheus.yml 定义了监控主机 192.168.6.110 的 node expoter job, 现在这台主机不用了,这时我们要将这条给删除。
操作
按照常规的步骤我们 vim prometheus.yml 然后将主机删除保存退出,然后我们再执行一下热加载:
curl -X POST 'http://127.0.0.1:9090/-/reload'
此时你会惊愕的发现,虽然 prometheus 容器的日志里已经出现了 reload prometheus.yml的日志,但是实际上并没有生效,再target中这台主机依然存在。
查看容器里的 promehteus.yml
docker exec -it prometheus cat /etc/prometheus/prometheus.yml
或者
curl -s http://127.0.0.1:9090/api/v1/status/config | jq -r '.data.yaml'
你会发现文件内容根本就没有改变,可我明明就已经在宿主机上修改了呀。
为什么?
原因是 bind mount 被“断开”或失效了!这个锅给到 vim
因为 Vim 编辑时替换了文件 inode ,当你用 vim 编辑并保存时,它不是直接修改原文件,而是:
- 写入一个临时新文件;
- 删除原文件;
- 把新文件 rename 成旧文件名。
这会导致 Docker bind mount 的文件 “引用” 仍指向原文件的 inode,而不是新的文件。
所以,容器看到的仍是旧的文件内容,宿主机看到的是新内容,实际上两者“断开”了。
解决办法
方法一:使用 nano 或者 micro 工具编辑文件,不会替换 inode
方法二:使用 vim 但是在保存退出时使用 :w !tee %
方法三:直接重启容器
文章目录
关闭
共有 0 条评论