使用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 %
方法三:直接重启容器

版权声明:
作者:admin
链接:https://www.chenxie.net/archives/2790.html
来源:蜀小陈
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录