#!/bin/bash ################################################## # Mount dir # # - /opt/kafka/data # # - /opt/kafka/logs # # ENV # # - CONF # # - CLUSTER_ID # # - LEAD_CONTROLLER # # - KAFKA_HEAP_OPTS # # - EXTRA_ARGS # # - _CONF_* # ################################################## set -euo pipefail export LANG=en_US.UTF-8 trap Quit EXIT PIDS= GOT_SIGTERM= CONF=${CONF:?} CONF_FILE=config/$CONF.properties CLUSTER_ID=${CLUSTER_ID:?} LEAD_CONTROLLER=${LEAD_CONTROLLER:-} function Print { local file=/dev/null [ '-f' = "$1" ] && file=$2 && shift && shift date +"[%F %T] $*" | tee -a $file } function Quit { while :; do pkill -f java && Print killing java ... || break sleep 1 done Print Container stopped. test -n "$GOT_SIGTERM" } function Usage { Print 'This container should run with **root user** **/opt/kafka/{data,logs} mounted from host** ' } function ModifyConf { local kv= ! cp -f $CONF_FILE.origin $CONF_FILE \ && Print Skipped modifying $CONF_FILE ... \ && return 0 Print Modifying $CONF_FILE ... echo -e "\n#### Docker" >> $CONF_FILE while read kv; do [ -z "$kv" ] && break Print Modifying property: ${kv%%=*} ... sed -i "/^${kv%%=*} *=/d" $CONF_FILE echo "$kv" >> $CONF_FILE done <<< "$(env | grep '^_CONF_' | sed 's/_CONF_//')" } function StartProc { [[ ! "$CONF" =~ ^broker|controller|server$ ]] \ && Print Unknown conf: $CONF! \ && exit 1 Print Formatting storage ... if [ -z "$LEAD_CONTROLLER" -a 'broker' != "$CONF" ]; then kafka-storage.sh format -g -t $CLUSTER_ID -c $CONF_FILE -s else kafka-storage.sh format -g -t $CLUSTER_ID -c $CONF_FILE -N fi Print Starting kafka ... kafka-server-start.sh $CONF_FILE &>> logs/kafka.out & PIDS="$PIDS $!" Print Kafka started. [ -e data/$CONF.lock ] && return 0 [ -z "$LEAD_CONTROLLER" -o 'broker' == "$CONF" ] \ && touch data/$CONF.lock \ && return 0 Print Join in kraft cluster with $LEAD_CONTROLLER after 10s ... sleep 10 [ ! -e /proc/$! ] && Print Unexpected error! && exit timeout 10 kafka-metadata-quorum.sh --command-config $CONF_FILE \ --bootstrap-controller $LEAD_CONTROLLER add-controller \ && touch data/$CONF.lock \ && return 0 Print Failed to join cluster with $LEAD_CONTROLLER! exit 1 } function Main { local pid= cd /opt/kafka Usage ModifyConf StartProc trap "GOT_SIGTERM=1; Print Got SIGTERM ..." SIGTERM while [ -z "$GOT_SIGTERM" ] && sleep 2; do for pid in $PIDS; do [ ! -e /proc/$pid ] && Print Unexpected error! && exit done done } # Start here Main