Nomad任务:Docker参数中环境变量插值问题求助
解决Thanos Sidecar Nomad任务中$NOMAD_ADDR_prometheus_ui插值问题
以下是三种可行的解决方法,均能避免依赖Consul查询,且支持任务重调度时自动同步地址:
方法1:通过Nomad env块中转变量
在Nomad任务的env块中显式声明变量,再在args里通过Terraform的env函数引用:
job "thanos-sidecar" { group "sidecar" { task "thanos" { driver = "docker" env { # 将Nomad自动注入的端口变量转为任务内可用变量 PROMETHEUS_UI_ADDR = "${NOMAD_ADDR_prometheus_ui}" } config { image = "thanosio/thanos:latest" args = [ "sidecar", "--prometheus.url=http://${env("PROMETHEUS_UI_ADDR")}", # 其他Thanos参数... ] } } } }
原理:Nomad会自动为同组任务注入$NOMAD_ADDR_<task>_<port>变量,通过env块中转后,Terraform的templatefile可正确插值该变量,且任务重调度时Nomad会自动更新这个环境变量的值。
方法2:用Nomad template生成启动脚本
通过template块生成shell启动脚本,直接在脚本中引用环境变量,绕开Terraform插值冲突:
job "thanos-sidecar" { group "sidecar" { task "thanos" { driver = "docker" template { data = <<EOF #!/bin/sh exec thanos sidecar --prometheus.url=http://$NOMAD_ADDR_prometheus_ui EOF destination = "local/start.sh" mode = "0755" } config { image = "thanosio/thanos:latest" command = "/local/start.sh" volumes = ["local/start.sh:/local/start.sh"] } } } }
原理:容器启动时执行脚本,shell会直接解析Nomad注入的$NOMAD_ADDR_prometheus_ui环境变量,完全避免Terraform和Nomad的插值语法冲突,重调度时变量自动更新。
方法3:使用Nomad运行时插值(推荐)
在Terraform templatefile中通过双大括号转义,让Nomad在运行时替换变量:
# Terraform templatefile内的配置 job "thanos-sidecar" { group "sidecar" { task "thanos" { driver = "docker" config { image = "thanosio/thanos:latest" args = [ "sidecar", "--prometheus.url=http://${{NOMAD_ADDR_prometheus_ui}}", # 其他Thanos参数... ] } } } }
原理:Terraform会将${{...}}转义为Nomad的${...}插值语法,任务启动时由Nomad直接替换为当前的$NOMAD_ADDR_prometheus_ui值,无需额外配置,是最简洁的方案。
内容的提问来源于stack exchange,提问作者Frank Siler
相关产品推荐
相关产品推荐

