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

我正在尝试使用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" 

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

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

它在启动用户容器之前等待端口可用,并且该系统工作,但是不在正确的时间。 卡夫卡似乎正在打开9092港口,然后才选出领导人。

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

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

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

您可以:

 depends_on: kafka: condition: service_healthy 

在卡夫卡中添加:

 healthcheck: test: ["CMD", ...] interval: 30s timeout: 10s retries: 5 

例如用一个curl命令来testing卡夫卡是否选举了领导人。