You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose中Kafka生产者连接报错:bootstrap.servers URL无效

问题

在Docker Compose栈中部署Kafka生产者时遇到连接异常:本地运行生产者,通过指向Kafka容器映射端口的环境变量可成功发送消息;但生产者容器化后,尽管环境变量已正确传递,仍抛出错误:

ConfigException: Invalid url in bootstrap.servers: "kafka:29092"

基于Confluent和Spring相关示例搭建ZooKeeper与Kafka,相关配置如下:

docker-compose.yml

version: '3'

networks:
  integrations:
    ipam:
      driver: default

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    hostname: zookeeper
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ALLOW_ANONYMOUS_LOGIN: "yes"
      ZOO_ADMINSERVER_ENABLED: "true"
    healthcheck:
      test: [ "CMD", "nc", "-zv", "127.0.0.1", "2181" ]
      interval: 120s
      timeout: 10s
      retries: 5
    ports:
      - 2181:2181
    networks:
      integrations:

  
  kafka:
    image: confluentinc/cp-kafka:latest
    hostname: kafka
    depends_on:
      - zookeeper
    restart: on-failure
    ports:
      - 9092:9092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092 ,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    healthcheck:
      test: [ "CMD", "nc", "-zv", "127.0.0.1", "9092" ]
      interval: 120s
      timeout: 10s
      retries: 5
    networks:
      integrations:

  producer:
    hostname: producer
    build:
      context: https://github.com/bry-git/SampleKafkaProducer.git#main
      dockerfile: Dockerfile
    depends_on:
      - zookeeper
      - kafka
    ports:
      - 8081:8081
    environment:
      - BOOTSTRAP_SERVER="kafka:29092"
      - KAFKA_TOPIC="primary"
    command: ["gradle", "bootRun"]
    networks:
      integrations:

Spring配置(application.yml)

server:
  port: 8088
spring:
  kafka:
    bootstrap-servers: ${BOOTSTRAP_SERVER}
    topic:
      name: ${KAFKA_TOPIC}
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer

Dockerfile

FROM gradle:jdk11
COPY . /SampleKafkaProducer
WORKDIR /SampleKafkaProducer

ARG BOOTSTRAP_SERVER
ENV BOOTSTRAP_SERVER=${BOOTSTRAP_SERVER}
ARG KAFKA_TOPIC
ENV KAFKA_TOPIC=${KAFKA_TOPIC}

EXPOSE 8088

排查记录

  1. 环境变量已成功传递:容器日志显示bootstrap.servers = ["kafka:29092"]
  2. 容器间网络连通正常:进入生产者容器后,通过nc命令可成功连接kafka的9092、29092端口及zookeeper的2181端口
  3. 本地运行生产者可正常连接Kafka
  4. 已尝试交换监听器配置、分配固定IP,均未解决问题
解决方案

问题根源在于环境变量的引号传递:

在docker-compose.yml的producer环境变量配置中,BOOTSTRAP_SERVER="kafka:29092"的双引号会被直接传递到容器内部,导致Spring读取到的地址是带引号的"kafka:29092",而Kafka客户端无法解析带引号的URL,从而抛出无效地址错误。

修复步骤:

  1. 修改docker-compose.yml中producer的环境变量,去掉引号:
    environment:
      - BOOTSTRAP_SERVER=kafka:29092
      - KAFKA_TOPIC=primary
    
  2. 重新构建并启动容器:
    docker-compose down
    docker-compose up --build
    

额外优化建议:

  • 移除Dockerfile中的ARG声明,因为docker-compose直接传递环境变量,无需通过构建参数中转,简化配置:
    FROM gradle:jdk11
    COPY . /SampleKafkaProducer
    WORKDIR /SampleKafkaProducer
    
    EXPOSE 8088
    
  • 当前Kafka的KAFKA_ADVERTISED_LISTENERS配置正确:PLAINTEXT对应容器内可访问的kafka:29092,PLAINTEXT_HOST对应外部可访问的localhost:9092,无需调整。

内容的提问来源于stack exchange,提问作者bcran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:05:19