├── Dockerfile ├── README.md └── zk-init.sh /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:vivid 2 | 3 | RUN apt-get update \ 4 | && apt-get -y install git ant openjdk-8-jdk \ 5 | && apt-get clean 6 | RUN mkdir /tmp/zookeeper 7 | WORKDIR /tmp/zookeeper 8 | RUN git clone https://github.com/apache/zookeeper.git . 9 | RUN git checkout release-3.5.1-rc2 10 | RUN ant jar 11 | RUN cp /tmp/zookeeper/conf/zoo_sample.cfg /tmp/zookeeper/conf/zoo.cfg 12 | RUN echo "standaloneEnabled=false" >> /tmp/zookeeper/conf/zoo.cfg 13 | RUN echo "dynamicConfigFile=/tmp/zookeeper/conf/zoo.cfg.dynamic" >> /tmp/zookeeper/conf/zoo.cfg 14 | ADD zk-init.sh /usr/local/bin/ 15 | ENTRYPOINT ["/usr/local/bin/zk-init.sh"] 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #Zookeeper 2 | 3 | This Docker image contains Zookeeper 3.5.1-rc2 which features dynamic host reconfiguration. Upon start, it attempts to join an existing cluster. 4 | 5 | The syntax to start a container is like this: 6 | 7 | `docker run --net host --name [name] containersol/zookeeper [id] [ip]` 8 | 9 | where 10 | - `id` = id of the zookeeper node (known internally as myid) 11 | - `ip` = ip address of a node of the existing cluster 12 | 13 | The `id` is mandatory, the `ip` is optional. 14 | 15 | The `--net host` is needed for zookeepers on different hosts to be able to contact each other. 16 | -------------------------------------------------------------------------------- /zk-init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ZK=$1 4 | MYID=1 5 | IPADDRESS=`ip -4 addr show scope global dev eth0 | grep inet | awk '{print \$2}' | cut -d / -f 1` 6 | 7 | cd /tmp/zookeeper 8 | if [ -n "$ZK" ] 9 | then 10 | output=`./bin/zkCli.sh -server $ZK:2181 get /zookeeper/config | grep ^server` 11 | 12 | # extract all the zk-ids from the output 13 | declare -a id_list=() 14 | while read x; 15 | do 16 | id_list+=(`echo $x | cut -d"=" -f1 | cut -d"." -f2`) 17 | done <<<$(output) 18 | sorted_id_list=( $( 19 | for el in "${id_list[@]}" 20 | do 21 | echo "$el" 22 | done | sort -n) ) 23 | 24 | # get the next increasing number from the sequence 25 | MYID=$((${sorted_id_list[${#sorted_id_list[@]}-1]}+1)) 26 | echo $output >> /tmp/zookeeper/conf/zoo.cfg.dynamic 27 | echo "server.$MYID=$IPADDRESS:2888:3888:observer;2181" >> /tmp/zookeeper/conf/zoo.cfg.dynamic 28 | cp /tmp/zookeeper/conf/zoo.cfg.dynamic /tmp/zookeeper/conf/zoo.cfg.dynamic.org 29 | /tmp/zookeeper/bin/zkServer-initialize.sh --force --myid=$MYID 30 | ZOO_LOG_DIR=/var/log ZOO_LOG4J_PROP='INFO,CONSOLE,ROLLINGFILE' /tmp/zookeeper/bin/zkServer.sh start 31 | /tmp/zookeeper/bin/zkCli.sh -server $ZK:2181 reconfig -add "server.$MYID=$IPADDRESS:2888:3888:participant;2181" 32 | /tmp/zookeeper/bin/zkServer.sh stop 33 | ZOO_LOG_DIR=/var/log ZOO_LOG4J_PROP='INFO,CONSOLE,ROLLINGFILE' /tmp/zookeeper/bin/zkServer.sh start-foreground 34 | else 35 | echo "server.$MYID=$IPADDRESS:2888:3888;2181" >> /tmp/zookeeper/conf/zoo.cfg.dynamic 36 | /tmp/zookeeper/bin/zkServer-initialize.sh --force --myid=$MYID 37 | ZOO_LOG_DIR=/var/log ZOO_LOG4J_PROP='INFO,CONSOLE,ROLLINGFILE' /tmp/zookeeper/bin/zkServer.sh start-foreground 38 | fi 39 | --------------------------------------------------------------------------------