Docker(撰写)客户端太早连接到Kafka

问题描述:

我想用Docker和Docker Compose运行Kafka。这是docker-compose.ymlDocker(撰写)客户端太早连接到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并让它完全启动并运行我的应用程序时,它运行顺利。

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

+0

你没有忘记阅读https://*.com/help/someone-answers,不是吗? – VonC

尝试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命令,例如,如果卡夫卡已经当选的领导者,其将考验。

+0

太棒了!他们解决了这个问题:-) – Industrial

+0

@Industrial他们确实!不要忘记阅读http://*.com/help/accepted-answer(对于这个答案,以及对其他问题的回答) – VonC

+0

是否有'curl'命令来测试kafka是否选举了领导者?你甚至可以卷曲卡夫卡? – c24w