在kafka-connect docker启动并运行后运行bash脚本

时间:2020-01-02 09:52:35

标签: bash docker apache-kafka apache-kafka-connect

我有以下docker文件

FROM confluentinc/cp-kafka-connect:5.3.1

ENV CONNECT_PLUGIN_PATH=/usr/share/java

# JDBC-MariaDB
RUN wget -nv -P /usr/share/java/kafka-connect-jdbc/ https://downloads.mariadb.com/Connectors/java/connector-java-2.4.4/mariadb-java-client-2.4.4.jar

# SNMP Source
RUN wget -nv -P /tmp/ https://github.com/KarthikDuggirala/kafka-connect-snmp/releases/download/0.0.1.11/kafka-connect-snmp-0.0.1.11.tar.gz
RUN mkdir /tmp/kafka-connect-snmp && tar -xf /tmp/kafka-connect-snmp-0.0.1.11.tar.gz -C /tmp/kafka-connect-snmp/
RUN mv /tmp/kafka-connect-snmp/usr/share/kafka-connect/kafka-connect-snmp /usr/share/java/

# COPY script and make it executable
COPY plugins-config.sh /usr/share/kafka-connect-script/plugins-config.sh
RUN ["chmod", "+x", "/usr/share/kafka-connect-script/plugins-config.sh"]

#entrypoint
ENTRYPOINT [ "./usr/share/kafka-connect-script/plugins-config.sh" ]

以及以下bash脚本

#!/bin/bash
#script to configure kafka connect with plugins
#export CONNECT_REST_ADVERTISED_HOST_NAME=localhost
#export CONNECT_REST_PORT=8083
url=http://$CONNECT_REST_ADVERTISED_HOST_NAME:$CONNECT_REST_PORT/connectors
curl_command="curl -s -o /dev/null -w %{http_code} $url"
sleep_second=5
sleep_second_counter=0
max_seconds_to_wait=30

echo "Waiting for Kafka Connect to start listening on localhost"
echo "HOST: $CONNECT_REST_ADVERTISED_HOST_NAME , PORT: $CONNECT_REST_PORT"
while [[ $(eval $curl_command) -eq 000 ]]
 do 
    echo "In"
    echo -e $date " Kafka Connect listener HTTP state: " $(eval $curl_command) " (waiting for 200) $sleep_second_counter"
    echo "Going to sleep for $sleep_second seconds"
    # sleep $sleep_second
    echo "Finished sleeping"
    # ((sleep_second_counter+=$sleep_second))
    echo "Finished counter"
done
echo "Out"
nc -vz $CONNECT_REST_ADVERTISED_HOST_NAME $CONNECT_REST_PORT

我尝试运行docker并使用docker日志查看发生了什么,我期望脚本将运行并等待直到kafka连接启动。但是显然,在说了几秒钟后,脚本或(我不知道挂了什么)挂起了,并且我看不到任何控制台打印了。

我有点失误了,所以我需要一些有关我失踪或不正确的方法的指导

我要做什么

我想要定义可以等待kafka连接启动然后运行curl命令的逻辑

curl -X POST -H“内容类型:application / json” --data'{“ name”:“”,“ config”:{“ connector.class”:“ com.github.jcustenborder .kafka.connect.snmp.SnmpTrapSourceConnector“,” topic“:” fm_snmp“}}'http://localhost:8083/connectors

PS:我不能使用docker-compose方式进行操作,因为在某些地方我必须使用 docker run

1 个答案:

答案 0 :(得分:1)

这里的问题是ENTRYPOINT将在容器启动时运行,并且将阻止默认的CMD运行,因为脚本将循环等待服务器启动,即脚本将循环因为CMD不会运行,所以永远。

您需要执行以下一项操作:

在您的Entrypoint中启动kafka连接服务器,并在CMD中启动脚本,或者在容器外部运行脚本...。