使用docker-compose时,Healthcheck根本不起作用(我的服务不等待Kafka在启动前启动)

卡斯·安德拉:

我在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);
        }
    }
}

即使depends_onSETUP-TOPICS服务依赖于Kafka才能起作用,但他不会等到Kafka启动后再运行并安装新主题。

我可以通过使用以下步骤来避免此步骤:

KAFKA_AUTO_CREATE_TOPICS_ENABLE=true

但是出于我的发展目的,我需要使其为FALSE并逐个创建它们。

最重要的是,我已经在运行状况检查中使用此命令进行了测试,而无需第三方文件:

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依赖项。

希望您理解我的观点,在此先感谢您的帮助。

板球运动员:

不清楚为什么需要JAR文件。这应该也一样

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

问题是waiting for kafka运行命令之前等待的时间不够长。depends_on不等healthcheck,AFAIK

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

docker-compose --env-file 根本不起作用

氣流 docker-compose.yml 中的連接管理根本不起作用?

使用docker-compose启动Docker Container

容器在使用Dockerfile时起作用,但在使用docker-compose.yml时不起作用

使用“ sudo docker -d”启动docker服务

使用 Navigator.push 和使用 Navigator.of 时,flutter setState 正在弹出页面,它根本不起作用

尝试使用我的docker-compose文件启动服务时出现问题,一个服务在另一个之前随机启动

当我有“体积”时,Docker Compose不起作用,否则它将起作用。为什么?

使用不同的变量多次启动docker-compose服务

使用 docker compose up 的本地主机不起作用

Traefik 的“使用 docker-compose 的基本示例”不起作用

无法使用docker-compose启动Celery

使用 docker-compose 运行 nodejs 不起作用,但使用 docker run 命令

如何使用Docker HEALTHCHECK?

Docker使用docker compose启动异常缓慢并收到异常

在docker容器中使用systemctl启动服务

使用ExecStartPost设置将Systemd配置为在httpd启动/重启后执行额外的脚本不起作用

cs50 web pset 1 中的登录表单根本不起作用(使用烧瓶)

使用discord.py的discord机器人代码根本不起作用

使用 getentry/sentry-cli 时 Docker 不起作用

使用docker时npm库不起作用

使用 Docker Compose 使用 Docker Desktop

如何在容器故障时使用 docker-compose 重新启动 docker 容器

docker 启动时无法使用 git

Docker compose不会等待Postgres启动

使用 NSSM 在 Windows 服务中启动 NodeJs 子进程不起作用

我正在android中使用内容提供程序创建一个数据库,但该数据库根本不起作用

使用JavaScript启动Docker机器

如何使用phpmyadmin启动Docker