2017-10-12 91 views
2

我正試着裝一個卡夫卡服務器。對於卡夫卡服務器正常啓動順序是這樣的:如何訂購Docker容器的Kafka啓動shell腳本?

A: start Zookeeper server 
B: start Broker server 
C: create topic 

項目AB是長時間運行的過程。並且C需要等待B啓動並運行。

所以我寫了一個Dockerfile,與ENTRYPOINT執行shell腳本用於上述順序:

#!/bin/sh 

$KAFKA_HOME/bin/zookeeper-server-start.sh $KAFKA_HOME/config/zookeeper.properties & 
$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties & 

$KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test_topic 

不過,我遇到了三個難題運行此建造了碼頭工人圖像時:

  • 泊塢窗要求ENTRYPOINT進程長時間運行,而上面的腳本沒有。 (只要完成主題創建就會退出)
  • 代理服務器語句(第二個)是長時間運行的過程。目前我必須把它作爲後臺進程使用結束&,因爲否則它後面的語句根本就沒有執行。 (但是使其背景也存在問題:主題創建立即執行,而代理服務器還沒有準備好。)
  • 我無法將代理服務器語句作爲最後一個長時間運行的進程,因爲主題創建語句必須在創建服務器之後。

什麼可能是安排這個啓動序列的好方法?

回答

1

Docker Compose涵蓋了許多編排任務,這些任務在腳本中都是非常重要的。

depends_onhealthcheck服務配置可用於創建適當的服務依賴關係,其中服務B在運行之前等待服務A「健康」。

儘管Compose尚未確定短期運行任務的定義概念,但主題創建始終可以在啓動時運行,因此立即退出的其他服務仍可正常運行。

有一個compose definition, Dockerfile and check script on github實現這種依賴性設置。

version: "2.1" 

services: 

    zookeeper: 
    image: deployable/kafka:latest 
    command: zookeeper 
    ports: 
    - "2181:2181" 
    healthcheck: 
     test: [ "CMD", "/kafka/check.sh", "zookeeper" ] 
     interval: 30s 
     timeout: 5s 
     retries: 3 

    kafka: 
    image: deployable/kafka:latest 
    command: kafka 
    environment: 
     ADVERTISE_LISTENERS: 'localhost:9092' 
    ports: 
    - "9092:9092" 
    depends_on: 
     zookeeper: 
     condition: service_healthy 
    healthcheck: 
     test: ["CMD", "/kafka/check.sh", "kafka" ] 
     interval: 30s 
     timeout: 5s 
     retries: 3 


    kafka-setup: 
    image: deployable/kafka:latest 
    command: setup 
    depends_on: 
     kafka: 
     condition: service_healthy 
    environment: 
     KAFKA_TOPIC: my-test-topic 
1

我建議將主題創建包裝到單獨的腳本中,在嘗試創建主題之前暫停,並且不在後臺運行Kafka服務器。喜歡的東西:

start-zookeeper & 
create-topic.sh & 
start-kafka 

而且create-topic.sh看起來如下:

sleep 5s 
kafka-topics --create... 

附:雖然不是睡覺,但最好通過探索卡夫卡的可用性nc -z

2

基本上你想要開始ZK,然後卡夫卡。 然後以某種方式等待卡夫卡準備就緒(這是棘手的部分),做你的工作與卡夫卡(例如在你的案例中的主題創建),然後等到卡夫卡& ZK完成(中斷髮生了什麼)。

start-zookeeper & 
ZK_PID=$! 
start-kafka & 
KAFKA_PID=$! 

# that's the tricky part 
wait_for_kafka 
create-topic.sh 

wait "${KAFKA_PID}" 
wait "${ZK_PID}" 

如前所述,卡夫卡準備可能是有難度的 - 通過以下方式可能會有所幫助:

  • 等到卡夫卡響應讀取請求
  • (例如用 kafka-topic.sh --list定期探測)
  • 創建口袋消費者/ AdminClient(java kafka 0.11+)並獲取元數據(類似於上面的點)
  • 檢查JMX bean是否存在l ogs/controller等
  • 檢查監聽端口可用性