2017-02-21 9 views
1

DockerとDocker ComposeでKafkaを実行しようとしています。これはdocker-compose.ymlです:Docker(Compose)クライアントが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の中カフカ・ノードを使用して)接続しようとすると、それが実行されるたびに話題に耳を傾け、それに一つのメッセージを公開しています。

問題は、接続拒否エラーが発生し続けることです。私はDockerizeを使用して、DockerfileのkafkaポートがCMD dockerize -wait tcp://kafka:9092 node /service/index.jsで利用可能になるのを待っています。

ユーザコンテナを起動する前にポートが利用可能になるのを待っていますが、このシステムは動作しますが、適切なタイミングではありません。カフカがリーダーを選ぶ前に9092港を開港しているようだ。

私はKafkaを最初に実行して完全に起動させてから、自分のアプリケーションを実行すると、スムーズに動作します。

サービスを開始する前に正しい瞬間を待つ方法を教えてください。

+0

あなたはhttps://stackoverflow.com/help/someone-answersを読むのを忘れましたか? – VonC

答えて

2

healthcheck指示文が含まれているので、ドッカー作成バージョン2.1または3を試してください。
例として「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

kafkaがリーダーを選出したかどうかをテストするための 'curl'コマンドはありますか?カフカを「カール」さえできますか? – c24w

関連する問題