Docker (Compose) 客户端过早连接到 Kafka

Ind*_*ial 7 apache-kafka docker docker-compose

我正在尝试使用 Docker 和 Docker Compose 运行 Kafka。这是docker-compose.yml

version: "2"

services:
  zookeeper:
    image: "wurstmeister/zookeeper"
    ports:
      - "2181:2181"

  kafka:
    build:
      context: "./services/kafka"
      dockerfile: "Dockerfile"
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: "0.0.0.0"
      KAFKA_CREATE_TOPICS: "test:1:1"
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"

  users:
    build:
      context: "./services/users"
      dockerfile: "Dockerfile"
    ports:
      - "4001:4001"
    environment:
      NODE_ENV: "develop"
      ZOOKEEPER_HOST: "zookeeper"
      ZOOKEEPER_PORT: "2181"
    volumes:
      - "./services/users:/service"
Run Code Online (Sandbox Code Playgroud)

用户服务仅尝试连接(在 Node.js 中使用 kafka-node)并侦听主题并在每次运行时向其发布一条消息。

问题是我不断收到连接拒绝错误。我使用Dockerize等待卡夫卡端口是在供Dockerfile与线CMD dockerize -wait tcp://kafka:9092 node /service/index.js

它在启动用户容器之前等待端口可用并且该系统可以工作,但它不是在正确的时间。看来Kafka在选举出leader之前就打开了9092端口。

当我首先运行 Kafka 并让它完全启动然后运行我的应用程序时,它运行顺利。

如何在开始服务之前等待正确的时间?

Von*_*onC 7

尝试 docker-compose 2.1 或 3 版,因为它包含一个healthcheck指令。
以“ Docker Compose 在启动 Y 之前等待容器 X ”为例。

你可以:

depends_on:
  kafka:
    condition: service_healthy
Run Code Online (Sandbox Code Playgroud)

并在 kafka 添加:

healthcheck:
    test: ["CMD", ...]
    interval: 30s
    timeout: 10s
    retries: 5
Run Code Online (Sandbox Code Playgroud)

curl例如,使用一个命令来测试 kafka 是否已经选举了一个领导者。

  • 您可以使用 Kafka 本身提供的一些脚本。例如: `healthcheck: test: ["CMD", "kafka-topics.sh", "--list", "--bootstrap-server", "host.docker.internal:9092"] 间隔:30s 超时: 30 秒重试:4` (4认同)
  • 根据docker-compose文档:“版本3不再支持depends_on的条件形式”我想使用dockerize,但看不到如何使用动态端口。 (3认同)
  • 是否有 `curl` 命令来测试 kafka 是否选举了领导者?你甚至可以`curl` kafka吗? (2认同)