簡體   English   中英

使用 docker-compose 時,Healthcheck 根本不起作用(我的服務在啟動之前不等待 Kafka 啟動)

[英]Healthcheck not working at all when using docker-compose (My service do not wait for Kafka to be started before launching)

我的 docker-compose 上有三項服務:

version: '3.4'
  setup-topics:
    image: 'bitnami/kafka:2'
    hostname: setup-topics
    container_name: setup-topics
    command: "bash -c 'echo Waiting for Kafka to be ready... && \
                       ./opt/bitnami/kafka/bin/kafka-topics.sh --create --if-not-exists --zookeeper zookeeper:2181 --partitions 1 --replication-factor 1 --topic orders && \
                       ./opt/bitnami/kafka/bin/kafka-topics.sh --create --if-not-exists --zookeeper zookeeper:2181 --partitions 1 --replication-factor 1 --topic redis'"
    environment:
      KAFKA_BROKER_ID: ignored
      KAFKA_ZOOKEEPER_CONNECT: ignored
    depends_on:
      - kafka

  kafka:
    container_name: kafka
    hostname: kafka
    image: 'bitnami/kafka:2'
    ports:
      - '9092:9092'
      - '29092:29092'
    volumes:
      - 'kafka_data:/opt/kafka'
      - './Ping.jar:/Ping.jar'
    environment:
      - KAFKA_HEAP_OPTS=-Xms1g -Xmx1g
      - KAFKA_JVM_PERFORMANCE_OPTS=-Xms512m -Xmx512M
      - KAFKA_BROKER_ID:1
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:29092
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-server:9092,PLAINTEXT_HOST://localhost:29092
    depends_on:
      - zookeeper

    healthcheck:
      test: ["CMD", "java", "-jar", "/Ping.jar", "localhost", "9092"]
      interval: 30s
      timeout: 10s
      retries: 4

  zookeeper:
    container_name: zookeeper
    hostname: zookeeper
    image: 'bitnami/zookeeper:3'
    ports:
      - '2181:2181'
    volumes:
      - 'zookeeper_data:/bitnami'
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
      - ZOOKEEPER_CLIENT_PORT=32181
      - ZOOKEEPER_TICK_TIME=2000

這里是 Ping.java 文件(在 stackoverflow 上找到它的答案: Docker-Compose: How to healthcheck OpenJDK:8 container? ):

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Ping {
    public static void main(String[] args) {
        if (args.length != 2) {
            System.exit(-1);
        }

        String host = args[0];
        int port = 0;

        try {
            port = Integer.parseInt(args[1]);
        } catch (NumberFormatException e) {
            e.printStackTrace();
            System.exit(-2);
        }

        try (Socket socket = new Socket()) {
            socket.connect(new InetSocketAddress(host, port), 10 * 1000);
            System.exit(0);
        } catch (IOException e) {
            System.exit(1);
        }
    }
}

即使SETUP-TOPICS服務上的depends_on依賴於 Kafka 才能工作,但他不會等到 Kafka 啟動后再運行並安裝新主題。

我可以使用以下方法避免此步驟:

KAFKA_AUTO_CREATE_TOPICS_ENABLE=true

但是出於我的開發目的,我需要將其設為 FALSE 並一一創建。

最重要的是,我已經在 Healthcheck 中使用此命令進行了測試,無需第三方文件:

healthcheck:
  test: ["CMD", "bash", "-c", "unset" , "JMX_PORT" ,";" ,"/opt/bitnami/kafka/bin/kafka-topics.sh","--zookeeper","zookeeper:2181","--list"]
  interval: 30s
  timeout: 10s
  retries: 4

最后,這是我兩次嘗試都收到的錯誤消息:

Waiting for Kafka to be ready...
Error while executing topic command : Replication factor: 1 larger than available brokers: 0.
[2020-06-01 15:06:28,809] ERROR org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 1 larger than available brokers: 0.
 (kafka.admin.TopicCommand$)

我知道我們也可以使用SLEEP命令來做到這一點,但它不專業,如果服務器上出現性能問題並且 Kafka 需要更長的時間來啟動,這將被錯過並再次收到與上述相同的錯誤。

我也聽說過kafkacat (我還沒有找到一個關於如何為此目的將它與 docker-compose 集成的示例)。

我想保持基本並使用有限的第三方工具來實現這個目標,這是我選擇 JAVA 文件的方式,因為圖像已經安裝了 Java 依賴項。

Hpe您理解我的觀點,提前感謝您的幫助。

不清楚為什么需要 JAR 文件。 這應該也可以

test: ["CMD", "nc", "-vz", "localhost", "9092"]

問題只是waiting for kafka在運行命令之前等待的時間不夠長。 depends_on不等待healthcheck ,AFAIK

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM