在Bamboo中配置Prometheus仓库流水线:解决Docker命令通配符参数传递失效问题
解决Bamboo中Docker命令通配符无法解析的问题
我之前在从Drone迁移到Bamboo时也碰到过一模一样的问题!核心原因是Drone会在shell环境里执行你的命令,通配符会被shell提前解析,但Bamboo的命令任务是直接把每个参数拆成独立字符串传给Docker,完全跳过了shell的展开步骤,所以*.rules就变成了一个字面量字符串,promtool自然找不到对应的文件。
下面给你几个实用的解决办法,按推荐程度排序:
1. 用shell包裹整个命令(最推荐)
让Docker启动一个shell进程,在shell内部执行promtool命令,这样通配符会被shell正常解析。修改后的命令如下:
docker run --volume $PWD:/data --workdir /data --rm prom/prometheus:v2.15.2 sh -c 'promtool check rules files/thanos-rules/*.rules'
注意这里的变化:
- 去掉了
--entrypoint=promtool,改用sh -c来执行完整的命令字符串 - 把原本的promtool命令用单引号包起来,作为
sh -c的参数,这样shell会先把*.rules展开成实际的文件列表,再传给promtool
2. 改用Bamboo的"脚本任务"
如果当前用的是Bamboo的"命令任务"直接执行docker命令,换成"Shell脚本任务",把命令写在脚本里:
#!/bin/bash docker run --volume $PWD:/data --workdir /data --rm --entrypoint=promtool prom/prometheus:v2.15.2 check rules files/thanos-rules/*.rules
这种方式和你在Drone里的逻辑最接近——脚本会在shell环境下执行,通配符会被自动展开,不需要额外调整命令结构。
3. 手动列出所有规则文件(应急用)
如果你的规则文件数量很少,也可以直接把所有.rules文件列出来,绕过通配符:
docker run --volume $PWD:/data --workdir /data --rm --entrypoint=promtool prom/prometheus:v2.15.2 check rules files/thanos-rules/alert.rules files/thanos-rules/recording.rules
但这种方式维护起来很麻烦,新增规则文件后得手动更新命令,所以只适合临时应急用。
简单说下原理
Drone执行命令时,相当于在宿主(或容器内)的shell里敲命令,shell会先做通配符展开、变量替换这些预处理,再把处理后的参数传给Docker;而Bamboo的命令任务是直接调用系统的exec函数,把每个参数原封不动传进去,没有shell参与,所以*.rules不会被解析成实际的文件列表。
内容的提问来源于stack exchange,提问作者Brandon Kauffman
相关产品推荐
相关产品推荐

