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卡夫卡是否选举了领导人。