Kafka grep over docker compose logs在CircleCI上的until循环中意外返回255退出代码

cqoc49vn  于 2023-10-15  发布在  Apache
关注(0)|答案(2)|浏览(92)

对于我的应用程序,我使用的是Kafka,我希望有一种方法可以确保在尝试在CI测试套件中运行应用程序e2e测试之前,正确地等待它准备就绪。为此,我使用了until bash关键字,并在日志中查找一行代码来表明它已经就绪,started (kafka.server.KafkaServer)。完整的设置是:

until docker compose logs kafka 2>/dev/null | grep -q "started (kafka.server.KafkaServer)"; do
  sleep 1
done

我发现,如果这个循环在Kafka完全启动并准备好之前运行,那么until会像预期的那样循环,直到Kafka完全准备好。然而,如果这个循环在Docker容器启动后运行,那么这个循环永远不会结束,从我的测试中,我得到了一个一致的255错误代码。然而,如果我在循环中添加相同的grep行,我确实看到这行始终被找到,我得到$? = 0,所以我不确定问题出在哪里。
作为参考,下面是我运行的解决问题的完整CircleCI命令:

- run:
          name: 'Start background services'
          working_directory: services
          background: true
          command: docker-compose up
      - run:
          name: 'Build images for app'
          working_directory: app
          command: docker-compose build
      - run:
          name: 'Wait for services'
          working_directory: services
          command: |
            until docker compose logs kafka | grep -q "started (kafka.server.KafkaServer)"; do
              sleep 1
            done
            echo "Kafka is ready"

如果构建图像的步骤花费>= 1分钟,我在until循环中得到一个错误,而如果图像被完全缓存,则循环工作正常。

llycmphe

llycmphe1#

-q告诉grep一旦找到匹配模式的行就以success退出,如果在任何输入中都没有找到匹配的行则以失败退出,否则不会在标准输出上打印任何内容。

gojuced7

gojuced72#

您可以在撰写中添加健康检查。你不需要grep日志。
当代理运行正常时创建主题的示例

kafka:
    image: &kafka-image bitnami/kafka:3.4.1
    restart: unless-stopped
    ports:
      - "29092:29092"
    environment:
      BITNAMI_DEBUG: yes
      ALLOW_PLAINTEXT_LISTENER: yes
      KAFKA_ENABLE_KRAFT: yes
      KAFKA_CFG_PROCESS_ROLES: controller,broker
      KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CFG_NODE_ID: 1
      KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
      KAFKA_CFG_DELETE_TOPIC_ENABLE: 'true'
      KAFKA_CFG_LOG_RETENTION_HOURS: 72  # 3 days of retention for local testing
      # https://rmoff.net/2018/08/02/kafka-listeners-explained/
      KAFKA_CFG_LISTENERS: INTERNAL://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:29092
      KAFKA_CFG_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_CFG_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,EXTERNAL://127.0.0.1:29092
      KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT
    healthcheck:
      test: ["CMD", "kafka-topics.sh", "--bootstrap-server=localhost:9092", "--list"]
      start_period: 15s
      interval: 30s

  init-kafka:
    image: *kafka-image
    working_dir: /opt/bitnami/kafka/bin
    entrypoint: /bin/bash
    depends_on:
      kafka:
        condition: service_healthy
    command: |
      kafka-topics.sh --create --if-not-exists --topic foo --replication-factor=1 --partitions=3 --bootstrap-server kafka:9092

可以随意将init服务更改为您的测试容器

相关问题