kafka_exporter_run.sh脚本解读

https://github.com/strimzi/strimzi-kafka-operator/blob/main/docker-images/kafka-based/kafka/exporter-scripts/kafka_exporter_run.sh


1. 脚本前言

#!/usr/bin/env bash
set -e
set +x
  • #!/usr/bin/env bash: 指定使用 Bash 解释器。
  • set -e: 遇到错误时退出脚本。
  • set +x: 禁用命令回显,防止敏感信息泄露(如环境变量)。

2. 配置 LOG_DIR

export LOG_DIR="$KAFKA_EXPORTER_HOME"
  • 作用: 设置 LOG_DIR 环境变量,避免脚本尝试创建日志目录。
  • 注意: LOG_DIR 并未真正用于日志管理,只是为了避免权限问题。

3. 正则过滤器配置

if [ -n "$KAFKA_EXPORTER_GROUP_REGEX" ]; then
    groupregex="--group.filter=\""${KAFKA_EXPORTER_GROUP_REGEX}"\""
fi
  • 作用: 检查 KAFKA_EXPORTER_GROUP_REGEX 是否设置,若设置,则赋值给 groupregex,用于配置消费者组正则过滤器。
  • 类似逻辑适用于其他变量:
    • KAFKA_EXPORTER_TOPIC_REGEX: 主题过滤器。
    • KAFKA_EXPORTER_GROUP_EXCLUDE_REGEX: 消费者组排除正则。
    • KAFKA_EXPORTER_TOPIC_EXCLUDE_REGEX: 主题排除正则。
  • 改进建议: 使用 printf 代替直接拼接,避免引号嵌套问题。

4. Sarama 日志启用

if [ "$KAFKA_EXPORTER_ENABLE_SARAMA" = "true" ]; then
    saramaenable="--log.enable-sarama"
fi
  • 作用: 根据 KAFKA_EXPORTER_ENABLE_SARAMA 的值,决定是否启用 Sarama 的调试日志。
  • Sarama: Kafka 的 Go 客户端库。

5. 显示所有偏移量

if [ "$KAFKA_EXPORTER_OFFSET_SHOW_ALL" = "false" ]; then
    allgroups="--no-offset.show-all"
fi
  • 作用: 如果 KAFKA_EXPORTER_OFFSET_SHOW_ALLfalse,则禁用显示所有偏移量的默认行为。

6. 设置日志级别

if [ -n "$KAFKA_EXPORTER_LOGGING" ]; then
    loglevel="--verbosity=${KAFKA_EXPORTER_LOGGING}"
fi
  • 作用: 允许用户通过环境变量 KAFKA_EXPORTER_LOGGING 设置日志详细级别。

7. 合并 CA 证书

CA_CERTS=/tmp/cluster-ca.crt
for cert in /etc/kafka-exporter/cluster-ca-certs/*.crt; do
  sed -z '$ s/\n$//' "$cert" >> "$CA_CERTS"
  echo "" >> "$CA_CERTS"
done
  • 作用:
    • 遍历 /etc/kafka-exporter/cluster-ca-certs 下的所有 .crt 文件。
    • 使用 sed 移除每个文件末尾的多余换行符并追加到 CA_CERTS
  • 改进建议:
    • 检查目标目录是否为空,避免 *.crt 匹配不到文件导致错误。
    • 使用 cat 更高效地合并文件:
      cat /etc/kafka-exporter/cluster-ca-certs/*.crt > "$CA_CERTS"
      

8. 配置 Kafka 参数

version="--kafka.version=\""$KAFKA_EXPORTER_KAFKA_VERSION"\""
kafkaserver="--kafka.server="$KAFKA_EXPORTER_KAFKA_SERVER
listenaddress="--web.listen-address=:9404"
tls="--tls.enabled --tls.ca-file=$CA_CERTS --tls.cert-file=/etc/kafka-exporter/kafka-exporter-certs/kafka-exporter.crt  --tls.key-file=/etc/kafka-exporter/kafka-exporter-certs/kafka-exporter.key"
  • 作用:
    • 配置 Kafka 版本、Kafka 服务器地址、监听地址以及 TLS 相关文件路径。
    • 这些选项通过对应的环境变量动态设置。

9. 生成运行脚本

cat <<EOT > /tmp/run.sh
$KAFKA_EXPORTER_HOME/kafka_exporter \
$groupregex \
$topicregex \
$groupExcludeRegex \
$topicExcludeRegex \
$tls \
$kafkaserver \
$saramaenable \
$listenaddress \
$allgroups \
$loglevel \
$version
EOT

chmod +x /tmp/run.sh
  • 作用:
    • 动态生成最终的 Kafka Exporter 启动脚本 /tmp/run.sh
    • 包含所有配置参数,方便调试或复用。

10. 执行脚本

exec /usr/bin/tini -w -e 143 -- /tmp/run.sh
  • 作用: 使用 tini(轻量级 init 系统)启动 Kafka Exporter,确保子进程信号处理和进程清理。
  • 选项说明:
    • -w: 等待子进程。
    • -e 143: 使用信号 143(SIGTERM)处理退出。

整体改进建议

  1. 变量验证: 增加环境变量的有效性检查,避免因未设置变量导致脚本中断。
  2. 日志管理: 考虑将日志输出到文件以便于调试。
  3. 错误处理: 为关键步骤(如文件操作)增加错误捕获机制,提供用户友好的错误提示。
  4. 参数打印: 在生成 /tmp/run.sh 前打印最终的命令,便于检查和调试。

这是一个设计良好的动态配置脚本,灵活地支持多种 Kafka Exporter 配置选项,同时通过 tini 提供可靠的进程管理支持。

<think>我们遇到了一个错误:在执行命令 `KAFKA_CLUSTER_ID=$(docker run --rm apache/kafka:3.7.0 kafka-storage.sh random-uuid)` 时,报错 `/__cacert_entrypoint.sh: exec: line 30: kafka-storage.sh: not found`。这个错误表明在容器内找不到 `kafka-storage.sh` 脚本。 根据引用[1]中的Docker Compose配置,我们可以看到在官方Apache Kafka镜像中,启动命令是通过完整的路径来调用脚本的,例如 `bin/kafka-storage.sh`。而在你执行的命令中,我们直接使用了 `kafka-storage.sh`,这可能导致在默认的PATH路径下找不到该脚本。 另外,引用[3]中Dockerfile的环境变量设置部分显示,Kafka脚本位于 `$KAFKA_HOME/bin` 目录下,并且该目录被添加到了PATH环境变量中。但是,我们执行的命令并没有进入容器内的shell环境,而是直接执行命令,因此需要指定脚本的完整路径。 解决方案: 1. 使用完整路径:在容器内,Kafka脚本位于 `/opt/kafka/bin/` 目录下(根据官方镜像的文档,Kafka安装在`/opt/kafka`)。因此,我们应该使用绝对路径来执行脚本。 2. 或者,我们可以先进入容器内的shell,然后执行命令。但是这里我们只需要获取一个UUID,所以使用完整路径更直接。 因此,修改命令为: ```bash KAFKA_CLUSTER_ID=$(docker run --rm apache/kafka:3.7.0 /opt/kafka/bin/kafka-storage.sh random-uuid) ``` 注意:在引用[1]的Docker Compose文件中,使用的是相对路径 `bin/kafka-storage.sh`,这是因为在Docker Compose的command中,工作目录已经被设置为Kafka的安装目录(`/opt/kafka`)。但是当我们使用`docker run`直接执行命令时,我们需要指定绝对路径。 另外,引用[4]提到生成集群ID的另一种方法(使用Linux工具生成UUID并转换格式),但这里我们仍然使用Kafka自带的工具。 所以,正确的命令是使用绝对路径调用`kafka-storage.sh`。 如果问题仍然存在,请检查镜像版本。在apache/kafka:3.7.0镜像中,脚本应该位于`/opt/kafka/bin/`目录下。 如果还有问题,可以进入容器查看目录结构: ```bash docker run --rm -it apache/kafka:3.7.0 ls /opt/kafka/bin ``` 确保`kafka-storage.sh`文件存在。 总结:使用绝对路径执行脚本即可解决此问题。 </think> ### 解决 `kafka-storage.sh: not found` 错误的方法 #### 问题原因分析 执行命令 `docker run --rm apache/kafka:3.7.0 kafka-storage.sh random-uuid` 时报错 `/__cacert_entrypoint.sh: exec: line 30: kafka-storage.sh: not found`,根本原因是: 1. **路径配置错误**:Kafka脚本默认位于 `/opt/kafka/bin/` 目录下,但该目录不在容器默认的 `$PATH` 环境变量中[^1][^3] 2. **入口点限制**:官方镜像的入口点脚本 `/__cacert_entrypoint.sh` 会覆盖默认命令执行方式[^1] #### 解决方案(三种方式) ##### 方法1:使用绝对路径(推荐) ```bash KAFKA_CLUSTER_ID=$(docker run --rm apache/kafka:3.7.0 /opt/kafka/bin/kafka-storage.sh random-uuid) ``` - **原理**:直接指定脚本完整路径 `/opt/kafka/bin/kafka-storage.sh` - **验证**:输出应显示类似 `Formatting new standalone cluster with cluster id: ABCDEFGHIJKLMNOPQRSTUV` 的UUID ##### 方法2:进入容器Shell执行 ```bash docker run -it --rm apache/kafka:3.7.0 /bin/bash -c \ "cd /opt/kafka/bin && ./kafka-storage.sh random-uuid" ``` - **适用场景**:需要执行多个Kafka命令时 - **优势**:避免每次输入完整路径 ##### 方法3:使用Bitnami镜像(替代方案) ```bash KAFKA_CLUSTER_ID=$(docker run --rm bitnami/kafka:3.7 kafka-storage.sh random-uuid) ``` - **优势**:Bitnami镜像已正确配置PATH环境变量[^5] - **注意**:镜像标签改为 `bitnami/kafka:3.7` #### 关键补充说明 1. **路径验证**:检查容器内文件是否存在 ```bash docker run --rm apache/kafka:3.7.0 ls -l /opt/kafka/bin/kafka-storage.sh # 应输出:-rwxr-xr-x 1 root root 2323 Mar 11 12:34 ... ``` 2. **入口点机制**:官方镜像的入口点会尝试执行命令,但依赖正确PATH[^1] ```dockerfile ENTRYPOINT ["/__cacert_entrypoint.sh"] CMD ["start-kafka.sh"] # 实际工作脚本 ``` 3. **集群ID生成替代方案**(引用[4]): ```bash # 使用Linux工具生成兼容格式的UUID UUID=$(uuidgen | tr -d '-') KAFKA_CLUSTER_ID=$(echo $UUID | xxd -r -p | base64) ``` #### 验证成功输出 ```bash $ docker run --rm apache/kafka:3.7.0 /opt/kafka/bin/kafka-storage.sh random-uuid Formatting new standalone cluster with cluster id: ABCDEFGHIJKLMNOPQRSTUV # 示例ID ``` > 建议优先使用**方法1**的绝对路径方案,这是最可靠的解决方式。若需频繁操作,可考虑切换到Bitnami镜像[^5]。 --- ### 相关问题 1. 如何验证 Apache Kafka Docker 镜像中的环境变量配置? 2. Bitnami Kafka 镜像与官方镜像在 PATH 设置上有哪些具体差异? 3. 在 Docker Compose 中如何正确配置 Kafka 的 KRaft 模式? 4. 如何为 Apache Kafka 容器添加自定义脚本到 PATH? 5. 使用 xxd 和 base64 生成 Kafka 集群 ID 的原理是什么? : 官方镜像入口点机制导致PATH问题 : Kafka脚本实际路径为/opt/kafka/bin [^4]: 替代集群ID生成方案 : Bitnami镜像PATH配置更完善
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值