【发布时间】:2019-11-13 22:07:54
【问题描述】:
我正在尝试使用 docker 为每个节点 kafka 集群设置一个单一代理。这个想法是多个 docker 容器每个都包含一个代理,我将有另一个 docker 容器作为 zookeeper 节点。我正在构建一个图像,我可以将 zookeeper 地址和代理 ID 作为环境变量传递,这些变量将用于启动代理。当我从映像启动容器时,只需将它们作为环境变量传递,这对于调出具有不同代理 ID 的多个节点很有用。
这是我的 dockerfile:
FROM openjdk:8
RUN mkdir /kafka
WORKDIR /kafka
COPY kafka_2.12-2.3.0 kafka_2.12-2.3.0
COPY cmd.sh cmd.sh
RUN cat /etc/os-release
RUN chmod +x ./cmd.sh
CMD ["./cmd.sh"]
EXPOSE 9092
这是我的 cmd.sh
#!/bin/sh
export KAFKA_DIR=/kafka/kafka_2.12-2.3.0
if [[ -z $KAFKA_BROKER_ID || -z $KAFKA_ZOOKEEPER_ADDRESS ]]; then
echo 'Zookeeper address and broker id need to be set by env variables KAFKA_ZOOKEEPER_ADDRESS and KAFKA_BROKER_ID'
exit 1
fi
echo "Broker ID: ${KAFKA_BROKER_ID}"
echo "Zookeeper addresss: ${KAFKA_ZOOKEEPER_ADDRESS}"
"${KAFKA_DIR}"/bin/kafka-server-start.sh "${KAFKA_DIR}"/config/server.properties --override broker.id="${KAFKA_BROKER_ID}" --override zookeeper.connect="${KAFKA_ZOOKEEPER_ADDRESS}"
我从问题How to check if multiple variables are defined or not in bash得到这个
我希望看到错误消息,但结果却是:
./cmd.sh: 5: ./cmd.sh: [[: not found ./cmd.sh: 5: ./cmd.sh: -z: not found Broker ID: Zookeeper addresss: [2019-07-03 08:56:04,172] INFO Registered kafka:type=kafka.Log4jController MBean (kafka.utils.Log4jControllerRegistration$) [2019-07-03 08:56:04,752] ERROR Exiting Kafka due to fatal exception (kafka.Kafka$) org.apache.kafka.common.config.ConfigException: Invalid value for configuration broker.id: Not a number of type INT
【问题讨论】:
-
if [ -z "$KAFKA_ZOOKEEPER_ADDRESS" ] || [ -z "$KAFKA_BROKER_ID" ]; then...您使用的是 bash 语法,但不是 bash。 -
您是否考虑过扩展现有的 docker 镜像,例如hub.docker.com/r/confluentinc 的那些人?
-
@RobinMoffatt 我有一些空闲时间,我想我会通过这种方式了解更多信息。
标签: bash docker apache-kafka