【问题标题】:How to convert Kafka from docker-run command to docker-compose?如何将 Kafka 从 docker-run 命令转换为 docker-compose?
【发布时间】:2022-01-09 12:36:42
【问题描述】:

我正在构建 Kafka CDC,但按照文档,它运行了许多 docker-run 命令。

我想把它全部放入docker-compose.yml,但我在最后一条命令中失败了,我无法转换为

以下是命令

docker run -d --name postgres \
           -p 5432:5432 \
           -e POSTGRES_USER=start_data_engineer \
           -e POSTGRES_PASSWORD=password debezium/postgres:12

docker run -d --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper:1.1
docker run -d --name kafka -p 9092:9092 --link zookeeper:zookeeper debezium/kafka:1.1

docker run -d --name connect -p 8083:8083 --link kafka:kafka \
                                          --link postgres:postgres \
                             -e BOOTSTRAP_SERVERS=kafka:9092 \
                             -e GROUP_ID=sde_group \
                             -e CONFIG_STORAGE_TOPIC=sde_storage_topic \
                             -e OFFSET_STORAGE_TOPIC=sde_offset_topic debezium/connect:1.1

这是我无法转换的行

docker run -it --rm --name consumer --link zookeeper:zookeeper \
                                    --link kafka:kafka debezium/kafka:1.1 \
               watch-topic -a bankserver1.bank.holding --max-messages 1 | grep '^{' | jq

这是我目前的docker-compose.yml

version: '2'
services:
  zookeeper:
    image: debezium/zookeeper
    ports:
     - 2181:2181
     - 2888:2888
     - 3888:3888
  kafka:
    image: debezium/kafka
    ports:
     - 9092:9092
    links:
     - zookeeper
    environment:
     - ZOOKEEPER_CONNECT=zookeeper:2181
  postgres:
    image: debezium/postgres:9.6
    ports:
     - "5432:5432"
    environment:
     - POSTGRES_USER=user
     - POSTGRES_PASSWORD=password
  connect:
    image: debezium/connect
    ports:
     - 8083:8083
     - 5005:5005
    links:
     - kafka
     - postgres
     - zookeeper
    environment:
     - BOOTSTRAP_SERVERS=kafka:9092
     - GROUP_ID=1
     - CONFIG_STORAGE_TOPIC=my_connect_configs
     - OFFSET_STORAGE_TOPIC=my_connect_offsets
     - STATUS_STORAGE_TOPIC=my_source_connect_statuses
  consumer:
    image: debezium/kafka:1.1
    links:
     - zookeeper
     - kafka
    command: watch-topic -a bankserver1.bank.holding --max-messages 1 | grep '^{' | jq

当我运行docker-compose up 时,一切运行正常。但是consumer 总是会因为这个输出而失败。

The ZOOKEEPER_CONNECT variable must be set, or the container must be linked to one that runs Zookeeper.
consumer_1   | WARNING: Using default BROKER_ID=1, which is valid only for non-clustered installations.
consumer_1   | The ZOOKEEPER_CONNECT variable must be set, or the container must be linked to one that runs Zookeeper.

--- 更新 现在我只想阅读和击落。确保它首先工作。

然后我会有一个源来处理那些阅读的东西。

docker run -it --rm --name consumer --link zookeeper:zookeeper --link kafka:kafka debezium/kafka:1.1 watch-topic -a bankserver1.bank.holding | grep --line-buffered '^{' | <your-file-path>/stream.py > my-output/holding_pivot.txt

【问题讨论】:

  • 你为什么要这样做?最后一个命令将运行容器读取单个消息并击落?
  • 是的,我希望它能够读取单条消息并击落,我只希望它首先工作。然后我更改代码以防止它稍后被击落。我更新了@VovaBilyachat 的帖子。感谢您的提问
  • 我的意思是用 docker compose 运行它没有意义。

标签: docker apache-kafka docker-compose


【解决方案1】:

以下将起作用...
要点是

  • 不知道为什么,ZOOKEEPER_CONNECT 和 KAFKA_BROKER 没有自动设置。
  • 您必须将命令分解为一个列表。
  • 最后,管道命令没有在容器内运行。
version: '2'
services:
  zookeeper:
    image: debezium/zookeeper
    ports:
     - 2181:2181
     - 2888:2888
     - 3888:3888
  kafka:
    image: debezium/kafka
    ports:
     - 9092:9092
    environment:
     - ZOOKEEPER_CONNECT=zookeeper:2181
  postgres:
    image: debezium/postgres:9.6
    ports:
     - "5432:5432"
    environment:
     - POSTGRES_USER=user
     - POSTGRES_PASSWORD=password
  connect:
    image: debezium/connect
    ports:
     - 8083:8083
     - 5005:5005
    environment:
     - BOOTSTRAP_SERVERS=kafka:9092
     - GROUP_ID=1
     - CONFIG_STORAGE_TOPIC=my_connect_configs
     - OFFSET_STORAGE_TOPIC=my_connect_offsets
     - STATUS_STORAGE_TOPIC=my_source_connect_statuses
  consumer:
    image: debezium/kafka:1.1
    environment:
     - ZOOKEEPER_CONNECT=zookeeper:2181
     - KAFKA_BROKER=kafka:9092
    command: 
     - watch-topic 
     - -a 
     - bankserver1.bank.holding 
     - --max-messages 
     - "1"

【讨论】:

  • 不知道为什么 - debezium 容器有默认值。 brokerzookeeper,我相信
  • 我是这么想的,我往里面看了看,找到了。
  • docker-compose 自动连接每个服务。所以,如果服务名和主机名完全一样,就不需要指定链接了。
  • links 是一个已弃用的 Docker Compose 选项。它从来没有真正需要
【解决方案2】:

消费者总是因为这个输出而失败。

正如错误所说,您需要提供ZOOKEEPER_CONNECT。但是,您应该在那里使用entrypoint,而不是command

无论如何,我不知道 Debezium 容器是否有 Python 模块供您通过管道传输到 stream.pywatch-topic 做什么,但您不需要另一个 debezium/kafka 容器,因为您可以执行到正在运行的那个。

docker-compose exec kafka \
  bash -c "watch-topic -a bankserver1.bank.holding | grep --line-buffered '^{' | <your-file-path>/stream.py > my-output/holding_pivot.txt"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多