#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"