我正在尝试将Kafka服务器容器化。 Kafka服务器的正常启动顺序如下:
A: start Zookeeper server
B: start Broker server
C: create topic
项目 A
和 B
是长时间运行的进程。而 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
进程是长时间运行的,而上面的脚本则不是。(只要主题创建完成,它就退出了) - 代理服务器语句(第二个语句)是长时间运行的过程。目前,我必须使用结束符
&
将其作为后台进程放置,否则在它之后的语句根本不会被执行。(但将其设置为后台进程也有问题:主题创建立即执行,而代理服务器尚未准备好。) - 我无法将代理服务器语句放置在最后一个长时间运行的进程中,因为主题创建语句必须在服务器创建之后。
有什么好的方法来安排这个启动序列吗?