如何通过docker-compose将环境变量传入Prometheus的YAML配置
实现方法
Prometheus本身不支持直接从环境变量读取配置值,你可以通过模板替换的方式实现动态传入主机地址,以下是两种可行方案:
方案一:容器启动时动态生成配置(无需本地预处理)
- 调整Prometheus配置为模板格式
将你原有的prometheus.yml重命名为prometheus.yml.template,把固定的localhost替换为变量占位符${HOST},修改后内容如下:
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: prometheus static_configs: - targets: ['${HOST}:9090'] - job_name: golang metrics_path: /prometheus static_configs: - targets: - ${HOST}:9000
- 修改
docker-compose.yml配置
新增环境变量映射,覆盖默认启动逻辑,先替换模板生成实际配置再启动Prometheus:
prometheus: image: prom/prometheus:v2.24.0 volumes: - ./prometheus/:/etc/prometheus/ - prometheus_data:/prometheus environment: # 将宿主机传入的Host变量映射到容器内的环境变量 - HOST=${Host} entrypoint: ["/bin/sh", "-c"] command: - | # 安装替换工具envsubst apk add --no-cache gettext # 用环境变量替换模板占位符,生成实际配置文件 envsubst < /etc/prometheus/prometheus.yml.template > /etc/prometheus/prometheus.yml # 启动Prometheus,参数和原有配置保持一致 /bin/prometheus \ --config.file=/etc/prometheus/prometheus.yml \ --storage.tsdb.path=/prometheus \ --web.console.libraries=/usr/share/prometheus/console_libraries \ --web.console.templates=/usr/share/prometheus/consoles network_mode: "host" ports: - 9090:9090 restart: always
- 启动服务
直接使用你原来的命令启动即可,传入的Host值会自动同步到配置中:
Host=172.0.0.1 docker-compose up
方案二:本地预生成配置(更轻量,无容器额外依赖)
如果不想修改容器启动逻辑,可在本地提前完成模板替换,再启动服务:
- 同样先按方案一的步骤创建
prometheus.yml.template模板文件 - 新建启动脚本
start.sh,内容如下:
#!/bin/bash # 本地替换模板生成实际配置 envsubst < ./prometheus/prometheus.yml.template > ./prometheus/prometheus.yml # 启动服务 docker-compose up
- 给脚本加执行权限后启动:
chmod +x start.sh Host=172.0.0.1 ./start.sh
注意事项
- 如果本地环境没有
envsubst工具,可改用sed命令替换,模板占位符改为{{HOST}}后,替换命令写为:sed -i "s/{{HOST}}/$Host/g" ./prometheus/prometheus.yml - 注意变量大小写要对应,启动命令传入的变量名和docker-compose、模板中使用的变量名需保持一致
内容的提问来源于stack exchange,提问作者Keval Bhogayata
相关产品推荐
相关产品推荐

