gpt4 book ai didi

bash - 如何为 docker 容器订购 Kafka 启动 shell 脚本?

转载 作者:行者123 更新时间:2023-11-29 09:42:17 24 4
gpt4 key购买 nike

我正在尝试将 Kafka 服务器容器化。 Kafka 服务器的正常启动顺序是这样的:

A: start Zookeeper server
B: start Broker server
C: create topic

项目 AB 是长时间运行的进程。 C 需要等待 B 启动并运行。

所以我写了一个 Dockerfile,ENTRYPOINT 为上面的序列执行一个 shell 脚本:

#!/bin/sh

$KAFKA_HOME/bin/zookeeper-server-start.sh $KAFKA_HOME/config/zookeeper.properties &
$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties &

$KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test_topic

但是,我在运行由此构建的 docker 镜像时遇到了三个问题:

  • Docker 要求ENTRYPOINT 进程长时间运行,而上面的脚本不需要。 (只要主题创建完成就会退出)
  • 代理服务器语句(第二个)是一个长时间运行的进程。目前我必须将它作为后台进程使用结尾 &,否则它之后的语句根本不会执行。 (但是做后台也有问题:主题创建立即执行,而代理服务器还没有准备好。)
  • 我不能将代理服务器语句作为最后一个长时间运行的进程,因为主题创建语句必须在服务器创建之后。

安排此启动顺序的好方法是什么?

最佳答案

基本上你想启动ZK,然后是Kafka。然后以某种方式等到 Kafka 准备好(这是棘手的部分),用 kafka 完成你的工作(例如在你的情况下创建主题),然后等到 Kafka 和 ZK 完成(中断时会发生什么)。

start-zookeeper &
ZK_PID=$!
start-kafka &
KAFKA_PID=$!

# that's the tricky part
wait_for_kafka
create-topic.sh

wait "${KAFKA_PID}"
wait "${ZK_PID}"

如前所述,Kafka-readiness 可能很棘手 - 以下方法可能会有所帮助:

  • 等待 Kafka 响应读取请求(例如,定期使用 kafka-topic.sh --list 进行探测)
  • 创建袖珍消费者/AdminClient(java kafka 0.11+)并获取元数据(与上述点类似)
  • 检查日志/ Controller 等的 JMX bean 是否存在。
  • 检查监听端口可用性

关于bash - 如何为 docker 容器订购 Kafka 启动 shell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46719081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com