【问题标题】:Create Kafka topic in Docker works from command line but not from Shell script file在 Docker 中创建 Kafka 主题可以通过命令行而不是 Shell 脚本文件工作
【发布时间】:2021-12-18 22:45:07
【问题描述】:

我正在尝试使用 shell 脚本文件在 Docker 中运行的 Kafka 容器中创建主题。

docker-compose.yml

---
version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    container_name: zookeeper
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
    ports:
      - "22181:2181"

  kafka:
    image: confluentinc/cp-kafka:latest
    container_name: kafka
    depends_on:
      - zookeeper

    ports:
      - "29092:29092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

init.sh

#!/bin/zsh
docker compose up -d
docker exec kafka kafka-topics --create --bootstrap-server localhost:29092 --partitions 1 --replication-factor 1 --topic Test

当我运行 docker-compose 时容器启动正常,但主题创建失败。

[2021-11-04 17:35:07,957] WARN [AdminClient clientId=adminclient-1] Connection to node -1 (localhost/127.0.0.1:29092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

但是,当我在命令行中运行相同的命令时,没有任何更改,它可以正常工作并创建主题。

Created topic Test.

我很茫然,在这里阅读以前关于类似问题的问题并没有帮助:主要是由于拼写错误或在不需要的地方添加了引号。我已经尝试更改 #! bash、sh 和 usr/bin/env(以及其他)无济于事。

任何帮助表示赞赏。

Docker 版本:版本 20.10.8 在 Mac (Intel) 上运行

【问题讨论】:

  • 您正在运行容器并且没有任何睡眠持续时间,您正在尝试运行总是会失败的命令。将 docker-compose up -d 从 init.sh 中分离出来。等待 Broker 运行并准备好连接。

标签: docker shell apache-kafka docker-compose


【解决方案1】:

如错误消息所示,代理不可用(在您的情况下,它尚未启动)。 您可以等待代理完成启动过程(通过使用docker logs -f kafka 查看日志或在脚本中使用睡眠),然后运行您的命令来创建主题:

docker exec kafka kafka-topics --create --bootstrap-server localhost:29092 --partitions 1 --replication-factor 1 --topic Test

或者,您可以使用official Confluent example 之类的东西,而不必确定您的代理是否已完成初始化过程。 在本例中,an utility 用于等待 Kafka 集群准备就绪。

【讨论】:

  • 这太好了,谢谢。你是对的 - 这只是等待更长时间的问题。我之前尝试过 10 秒,但由于那没有用,我认为这是另一回事。我将尝试弄清楚如何在我的 init.sh 文件中使用 cub 以避免硬编码的睡眠时间。
【解决方案2】:

您在何处/何时运行init.sh 脚本?可能代理还没有开始。

此外,当您想在 Docker 网络中运行命令时,请使用内部侦听器

docker-compose exec kafka \
  bash -c "kafka-topics --create --bootstrap-server kafka:9092 --partitions 1 --replication-factor 1 --topic Test"

【讨论】:

  • 嗨。正如@Luigi Cerone 推荐的那样,通过使用 cub 命令等待 Kafka 解决了这个问题。正如您所建议的那样,我应该使用内部侦听器是否有特定的原因?没有它也能正常工作。
  • 两者都可以工作,只是因为你的监听器是这样配置的,但是,在 Docker 网络中最好使用 docker 服务名称
【解决方案3】:

修改init.sh

运行容器docker-compose up -d,等待代理运行。如果应用程序已启动并正在运行,请检查日志。

现在init.sh 应该只有create the topic command

#!/bin/zsh
docker exec kafka kafka-topics --create --bootstrap-server localhost:29092 --partitions 1 --replication-factor 1 --topic Test1

docker exec kafka kafka-topics --create --bootstrap-server localhost:29092 --partitions 1 --replication-factor 1 --topic Test2

docker exec kafka kafka-topics --create --bootstrap-server localhost:29092 --partitions 1 --replication-factor 1 --topic Test3

【讨论】:

  • 谢谢。你对等待时间的看法是对的,但我需要 init.sh 文件中的所有内容。 @Luigi Cerone 的 answer 提供帮助。
【解决方案4】:

每个人都是对的,我不得不等待更长的时间(我尝试了 10 秒)。

正如@Luigi Cerone 建议的那样,我使用cub 来等待Kafka 准备好,在创建主题之前添加此行:

docker exec kafka cub kafka-ready -b localhost:29092 1 20

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2017-07-12
    • 2014-07-04
    相关资源
    最近更新 更多