Amanda
08/20/2026, 3:06 PMDavid K
08/20/2026, 3:21 PMinitialize-cluster-metadata against ZooKeeper before the broker exists, and then exits. Your pulsar-admin commands for tenants/namespaces/topics/sinks talk to the broker’s REST admin API on :8080, which isn’t up yet.David K
08/20/2026, 3:22 PMDavid K
08/20/2026, 3:22 PMbroker:
image: apachepulsar/pulsar:4.0.6
# ... your existing config ...
environment:
PULSAR_PREFIX_functionsWorkerEnabled: "true" # needed if the sink runs in-broker
volumes:
- ./connectors:/pulsar/connectors # your sink NAR
healthcheck:
test: ["CMD", "bin/pulsar-admin", "brokers", "healthcheck"]
interval: 5s
timeout: 10s
retries: 30
start_period: 30s
pulsar-bootstrap:
image: apachepulsar/pulsar:4.0.6
container_name: pulsar-bootstrap
networks: [pulsar]
depends_on:
broker:
condition: service_healthy
volumes:
- ./bootstrap.sh:/bootstrap.sh:ro
- ./sink-config.yaml:/sink-config.yaml:ro
entrypoint: ["/bin/bash", "/bootstrap.sh"]
restart: on-failureDavid K
08/20/2026, 3:23 PMDavid K
08/20/2026, 3:24 PM#!/usr/bin/env bash
set -euo pipefail
PA="bin/pulsar-admin --admin-url <http://broker:8080>"
$PA tenants create acme 2>/dev/null || true
$PA namespaces create acme/prod 2>/dev/null || true
$PA namespaces set-retention acme/prod --size 1G --time 24h
$PA topics create-partitioned-topic <persistent://acme/prod/events> -p 3 2>/dev/null || true
$PA sinks create \
--tenant acme --namespace prod --name my-sink \
--sink-config-file /sink-config.yaml \
--inputs <persistent://acme/prod/events> 2>/dev/null \
|| $PA sinks update --tenant acme --namespace prod --name my-sink \
--sink-config-file /sink-config.yaml
echo "bootstrap complete"Amanda
08/20/2026, 3:38 PM