Как преобразовать Кафку из команды docker-run в команду docker-compose?

#docker #apache-kafka #docker-compose

#докер #апач-кафка #докер-сочинение

Вопрос:

Я создаю Kafka CDC, но, следуя документу, он запускает множество команд, запускаемых докером.

Я хочу поместить все это в a docker-compose.yml , но у меня не получается выполнить 1 последнюю команду, которую я не могу преобразовать в

Ниже приведены команды

 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 '^{' | lt;your-file-pathgt;/stream.py gt; my-output/holding_pivot.txt  

Комментарии:

1. Почему ты хочешь это сделать ? Последняя команда запустит контейнер, прочитает одно сообщение и выстрелит?

2. Да, я хочу, чтобы он прочитал одно сообщение и перестрелку, я просто хочу, чтобы это сработало в первую очередь. Затем я изменяю код, чтобы предотвратить его последующее сбивание. Я обновил пост @VovaBilyachat. Спасибо за ваш вопрос

3. Я хочу сказать, что запускать это с docker compose не имеет смысла.

Ответ №1:

Следующее будет работать…
Суть в следующем

  • Я не знаю почему, но ZOOKEEPER_CONNECT и KAFKA_BROKER не устанавливаются автоматически.
  • Вы должны разбить команды на список.
  • Наконец, команда pipe не была запущена внутри контейнера.
 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"  

Комментарии:

1. не знаю почему — у конатинеров debezium есть значения по умолчанию для них. broker и zookeeper , я верю

2. Я думаю, что да, я заглянул внутрь и нашел его.

3. Docker-compose автоматически подключает каждую службу. Таким образом, если имя службы и имя хоста точно совпадают, вам не нужно указывать ссылку.

4. links является устаревшим вариантом компоновки докера. На самом деле в этом никогда не было необходимости

Ответ №2:

потребитель всегда терпит неудачу с этим результатом.

Как говорится в ошибке, вам необходимо предоставить ZOOKEEPER_CONNECT . Однако вы должны использовать entrypoint там, а не command .

В любом случае, я не знаю, будет ли в контейнере Debezium модули Python, в которые вы можете передавать, stream.py или что watch-topic там еще, но вам не нужен другой debezium/kafka контейнер, так как вы можете выполнить в запущенном.

 docker-compose exec kafka   bash -c "watch-topic -a bankserver1.bank.holding | grep --line-buffered '^{' | lt;your-file-pathgt;/stream.py gt; my-output/holding_pivot.txt"