Docker(撰写)客户端太早连接到Kafka
我想用Docker和Docker Compose运行Kafka。这是docker-compose.yml
:Docker(撰写)客户端太早连接到Kafka
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的卡夫卡节点)连接和监听某个主题,并且是每次运行时发布一个消息给它。
问题是我不断收到Connection Refused错误。我正在使用Dockerize等待Dockerfile
中的线路CMD dockerize -wait tcp://kafka:9092 node /service/index.js
中的kafka端口可用。
它启动用户容器和此系统之前等待端口可用,但它不是在正确的时间。卡夫卡似乎在选举*之前打开了9092港口。
当我首先运行Kafka并让它完全启动并运行我的应用程序时,它运行顺利。
在开始我的服务之前,我该如何等待正确的时刻?
尝试docker-compose版本2.1或3,因为它包含healthcheck
指令。
以“Docker Compose wait for container X before starting Y”为例。
您可以:
depends_on:
kafka:
condition: service_healthy
而且在卡夫卡补充:
healthcheck:
test: ["CMD", ...]
interval: 30s
timeout: 10s
retries: 5
与curl
命令,例如,如果卡夫卡已经当选的领导者,其将考验。
太棒了!他们解决了这个问题:-) – Industrial
@Industrial他们确实!不要忘记阅读http://*.com/help/accepted-answer(对于这个答案,以及对其他问题的回答) – VonC
是否有'curl'命令来测试kafka是否选举了领导者?你甚至可以卷曲卡夫卡? – c24w
你没有忘记阅读https://*.com/help/someone-answers,不是吗? – VonC