diff --git a/Dockerfile b/Dockerfile index 43f6f12f..f01c12cb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ ENV PGVERSION 9.5 ENV PATH /usr/lib/postgresql/${PGVERSION}/bin:$PATH RUN apt-get update -y \ && apt-get upgrade -y \ - && apt-get install -y curl jq haproxy postgresql-${PGVERSION} python-psycopg2 python-yaml \ + && apt-get install -y curl jq haproxy zookeeper postgresql-${PGVERSION} python-psycopg2 python-yaml \ python-requests python-six python-click python-dateutil python-tzlocal python-urllib3 \ python-dnspython python-pip python-setuptools python-kazoo python-prettytable python \ && pip install python-etcd==0.4.3 python-consul==0.6.0 --upgrade \ @@ -34,14 +34,9 @@ ADD extras/confd /etc/confd RUN ln -s /patronictl.py /usr/local/bin/patronictl ### Setting up a simple script that will serve as an entrypoint -RUN mkdir /data/ && touch /pgpass /patroni.yml /var/run/haproxy.pid \ - && chown postgres:postgres -R /patroni/ /data/ /pgpass /patroni.yml /etc/haproxy /var/run/haproxy.pid \ - && for name in etcd haproxy; do \ - for ext in log err; do \ - touch /var/log/$name.$ext \ - && chown postgres:postgres /var/log/$name.$ext; \ - done; \ - done +RUN mkdir /data/ && touch /pgpass /patroni.yml \ + && chown postgres:postgres -R /patroni/ /data/ /pgpass /patroni.yml /etc/haproxy /var/run/ /var/lib/ /var/log/ \ + && echo 1 > /etc/zookeeper/conf/myid EXPOSE 2379 5432 8008 diff --git a/docker/dev_patroni_cluster.sh b/docker/dev_patroni_cluster.sh index 2260133e..9f21b128 100755 --- a/docker/dev_patroni_cluster.sh +++ b/docker/dev_patroni_cluster.sh @@ -86,11 +86,12 @@ docker_run ${ETCD_CONTAINER} ${DOCKER_IMAGE} --etcd DOCKER_ARGS="--link=${ETCD_CONTAINER}:${ETCD_CONTAINER} -e PATRONI_SCOPE=${PATRONI_SCOPE} -e PATRONI_ETCD_HOST=${ETCD_CONTAINER}:2379" PATRONI_ENV=$(sed 's/#.*//g' docker/patroni-secrets.env | sed -n 's/^PATRONI_.*$/-e &/p' | tr '\n' ' ') +PATRONI_VOLUME="-v $(dirname $(dirname $(realpath $0)))/patroni:/patroni" for i in $(seq 1 "${MEMBERS}"); do container_name=postgres${i} docker_run "${PATRONI_SCOPE}_${container_name}" \ - -v patroni:/patroni \ + $PATRONI_VOLUME \ $DOCKER_ARGS \ $PATRONI_ENV \ -e PATRONI_NAME=${container_name} \ diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 48f82460..5e5dac29 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -9,11 +9,13 @@ Options: --etcd Do not run Patroni, run a standalone etcd --confd Do not run Patroni, run a standalone confd + --zookeeper Do not run Patroni, run a standalone zookeeper Examples: $0 --etcd $0 --confd + $0 --zookeeper $0 __EOF__ } @@ -28,15 +30,26 @@ while getopts "$optspec" optchar; do -) case "${OPTARG}" in confd) - while ! curl -s ${PATRONI_ETCD_HOST}/v2/members | jq -r '.members[0].clientURLs[0]' | grep -q http; do - sleep 1 - done haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -D - exec confd -prefix=${PATRONI_NAMESPACE:-/service}/$PATRONI_SCOPE -backend etcd -node $PATRONI_ETCD_HOST -interval=10 + CONFD="confd -prefix=${PATRONI_NAMESPACE:-/service}/$PATRONI_SCOPE -interval=10 -backend" + if [ ! -z ${PATRONI_ZOOKEEPER_HOSTS} ]; then + while ! /usr/share/zookeeper/bin/zkCli.sh -server ${PATRONI_ZOOKEEPER_HOSTS} ls /; do + sleep 1 + done + exec $CONFD zookeeper -node ${PATRONI_ZOOKEEPER_HOSTS} + else + while ! curl -s ${PATRONI_ETCD_HOST}/v2/members | jq -r '.members[0].clientURLs[0]' | grep -q http; do + sleep 1 + done + exec $CONFD etcd -node $PATRONI_ETCD_HOST + fi ;; etcd) exec etcd $ETCD_ARGS ;; + zookeeper) + exec /usr/share/zookeeper/bin/zkServer.sh start-foreground + ;; cheat) CHEAT=1 ;; @@ -61,7 +74,7 @@ while getopts "$optspec" optchar; do done ## We start an etcd -if [ -z ${PATRONI_ETCD_HOST} ]; then +if [[ -z ${PATRONI_ETCD_HOST} && -z ${PATRONI_ZOOKEEPER_HOSTS} ]]; then etcd $ETCD_ARGS > /var/log/etcd.log 2> /var/log/etcd.err & export PATRONI_ETCD_HOST="127.0.0.1:2379" fi @@ -71,7 +84,7 @@ export PATRONI_NAME="${PATRONI_NAME:-${HOSTNAME}}" export PATRONI_RESTAPI_CONNECT_ADDRESS="${DOCKER_IP}:8008" export PATRONI_RESTAPI_LISTEN="0.0.0.0:8008" export PATRONI_admin_PASSWORD="${PATRONI_admin_PASSWORD:=admin}" -export PATRONI_admin_OPTIONS="$PATRONI_admin_OPTIONS:-createdb, createrole}" +export PATRONI_admin_OPTIONS="${PATRONI_admin_OPTIONS:-createdb, createrole}" export PATRONI_POSTGRESQL_CONNECT_ADDRESS="${DOCKER_IP}:5432" export PATRONI_POSTGRESQL_LISTEN="0.0.0.0:5432" export PATRONI_POSTGRESQL_DATA_DIR="data/${PATRONI_SCOPE}" @@ -93,7 +106,7 @@ bootstrap: __EOF__ mkdir -p "$HOME/.config/patroni" -ln -s /patroni.yml "$HOME/.config/patroni/patronictl.yaml" +[ -h "$HOME/.config/patroni/patronictl.yaml" ] || ln -s /patroni.yml "$HOME/.config/patroni/patronictl.yaml" [ -z $CHEAT ] && exec python /patroni.py /patroni.yml diff --git a/patroni-compose-etcd-3.yml b/patroni-compose-etcd-3.yml index 580feabd..2dbb7cfa 100644 --- a/patroni-compose-etcd-3.yml +++ b/patroni-compose-etcd-3.yml @@ -12,7 +12,7 @@ dbnode1: links: - patroni_etcd:patroni_etcd volumes: - - patroni:/patroni + - ./patroni:/patroni env_file: docker/patroni-secrets.env environment: PATRONI_ETCD_HOST: patroni_etcd:2379 @@ -25,7 +25,7 @@ dbnode2: links: - patroni_etcd:patroni_etcd volumes: - - patroni:/patroni + - ./patroni:/patroni env_file: docker/patroni-secrets.env environment: PATRONI_ETCD_HOST: patroni_etcd:2379 @@ -38,7 +38,7 @@ dbnode3: links: - patroni_etcd:patroni_etcd volumes: - - patroni:/patroni + - ./patroni:/patroni env_file: docker/patroni-secrets.env environment: PATRONI_ETCD_HOST: patroni_etcd:2379