diff --git a/Dockerfile b/Dockerfile index 421e775f..5e1b57b5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,36 +3,48 @@ FROM ubuntu:16.04 MAINTAINER Feike Steenbergen -RUN echo 'APT::Install-Recommends "0";' > /etc/apt/apt.conf.d/01norecommend -RUN echo 'APT::Install-Suggests "0";' >> /etc/apt/apt.conf.d/01norecommend +RUN echo 'APT::Install-Recommends "0";' > /etc/apt/apt.conf.d/01norecommend \ + && echo 'APT::Install-Suggests "0";' >> /etc/apt/apt.conf.d/01norecommend 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 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 \ + && apt-get install -y curl jq haproxy 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 \ && apt-get remove -y python-pip python-setuptools \ && apt-get autoremove -y \ # Clean up && apt-get clean -y \ - && rm -rf /var/lib/apt/lists/* + && rm -rf /var/lib/apt/lists/* /root/.cache -ENV PATH /usr/lib/postgresql/${PGVERSION}/bin:$PATH +ENV ETCDVERSION 2.3.6 +RUN curl -L https://github.com/coreos/etcd/releases/download/v${ETCDVERSION}/etcd-v${ETCDVERSION}-linux-amd64.tar.gz \ + | tar xz -C /usr/local/bin --strip=1 --wildcards --no-anchored etcd etcdctl + +ENV CONFDVERSION 0.11.0 +RUN curl -L https://github.com/kelseyhightower/confd/releases/download/v${CONFDVERSION}/confd-${CONFDVERSION}-linux-amd64 > /usr/local/bin/confd \ + && chmod +x /usr/local/bin/confd ADD patronictl.py patroni.py docker/entrypoint.sh / ADD patroni /patroni/ -RUN ln -s /patroni/patroni.py /usr/local/bin/patroni \ - && ln -s /patroni/patronictl.py /usr/local/bin/patronictl - -ENV ETCDVERSION 2.3.6 -RUN curl -L https://github.com/coreos/etcd/releases/download/v${ETCDVERSION}/etcd-v${ETCDVERSION}-linux-amd64.tar.gz | tar xz -C /bin --strip=1 --wildcards --no-anchored etcd etcdctl +ADD extras/confd /etc/confd +RUN ln -s /ppatroni.py /usr/local/bin/patroni \ + && ln -s /patronictl.py /usr/local/bin/patronictl ### Setting up a simple script that will serve as an entrypoint -RUN mkdir /data/ && touch /var/log/etcd.log /var/log/etcd.err /pgpass /patroni/postgres.yml \ - && chown postgres:postgres -R /patroni/ /data/ /pgpass /var/log/etcd.* /patroni/postgres.yml +RUN mkdir /data/ && touch /pgpass /patroni/postgres.yml /var/run/haproxy.pid \ + && chown postgres:postgres -R /patroni/ /data/ /pgpass /etc/haproxy /var/run/haproxy.pid \ + && for name in confd etcd haproxy; do \ + for ext in log err; do \ + touch /var/log/$name.$ext \ + && chown postgres:postgres /var/log/$name.$ext; \ + done; \ + done -EXPOSE 4001 5432 2380 +EXPOSE 4001 5432 8008 ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] USER postgres diff --git a/docker/dev_patroni_cluster.sh b/docker/dev_patroni_cluster.sh index dcc18f87..e14da579 100755 --- a/docker/dev_patroni_cluster.sh +++ b/docker/dev_patroni_cluster.sh @@ -77,14 +77,14 @@ then PATRONI_SCOPE=$(random_name) fi -etcd_container=$(docker run -P -d --name="${PATRONI_SCOPE}_etcd" "${DOCKER_IMAGE}" --etcd-only) +etcd_container=$(docker run -P -d --name="${PATRONI_SCOPE}_etcd" "${DOCKER_IMAGE}" --name="${PATRONI_SCOPE}" --etcd-only) etcd_container_ip=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${etcd_container}) echo "The etcd container is ${etcd_container}, ip=${etcd_container_ip}" for i in $(seq 1 "${MEMBERS}") do - container_name=$(random_name) - patroni_container=$(docker run -P -d --name="${PATRONI_SCOPE}_${container_name}" "${DOCKER_IMAGE}" --etcd="${etcd_container_ip}:4001" --name="${PATRONI_SCOPE}") + container_name="postgres${i}" + patroni_container=$(docker run -P -d -e "PATRONI_NAME=${container_name}" -e "PATRONI_ETCD_HOST=${etcd_container_ip}:4001" --name="${PATRONI_SCOPE}_${container_name}" "${DOCKER_IMAGE}" --etcd="${etcd_container_ip}:4001" --name="${PATRONI_SCOPE}") patroni_container_ip=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${patroni_container}) echo "Started Patroni container ${patroni_container}, ip=${patroni_container_ip}" done diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index c329d2bb..a87b5228 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -29,6 +29,10 @@ while getopts "$optspec" optchar; do -) case "${OPTARG}" in etcd-only) + (while sleep 1; do + confd -prefix=/service/$PATRONI_SCOPE -backend etcd -node 127.0.0.1:4001 \ + -interval=10 >> /var/log/confd.log 2>> /var/log/confd.err + done) & exec etcd --data-dir /tmp/etcd.data \ -advertise-client-urls=http://${DOCKER_IP}:4001 \ -listen-client-urls=http://0.0.0.0:4001 \ @@ -81,7 +85,7 @@ then fi export PATRONI_SCOPE -export PATRONI_NAME="${HOSTNAME}" +export PATRONI_NAME="${PATRONI_NAME:-${HOSTNAME}}" export PATRONI_ETCD_HOST="$ETCD_CLUSTER" export PATRONI_RESTAPI_CONNECT_ADDRESS="${DOCKER_IP}:8008" export PATRONI_RESTAPI_LISTEN="0.0.0.0:8008"