2017-02-21 91 views
1

我想用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://stackoverflow.com/help/someone-answers,不是嗎? – VonC

回答

2

嘗試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://stackoverflow.com/help/accepted-answer(對於這個答案,以及對其他問題的回答) – VonC

+0

是否有'curl'命令來測試kafka是否選舉了領導者?你甚至可以捲曲卡夫卡? – c24w