diff --git a/10/Dockerfile b/10/Dockerfile index 8804367ba8..5bf7be268a 100644 --- a/10/Dockerfile +++ b/10/Dockerfile @@ -125,9 +125,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/10/alpine/Dockerfile b/10/alpine/Dockerfile index bef2ba0b8e..bbf4982c9d 100644 --- a/10/alpine/Dockerfile +++ b/10/alpine/Dockerfile @@ -142,9 +142,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/10/alpine/docker-common.sh b/10/alpine/docker-common.sh new file mode 100644 index 0000000000..f47406d0c0 --- /dev/null +++ b/10/alpine/docker-common.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +LOCK_PATH=/tmp/docker-entrypoint.lock + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + diff --git a/10/alpine/docker-entrypoint.sh b/10/alpine/docker-entrypoint.sh index ffd2ed501c..333cecb9c1 100755 --- a/10/alpine/docker-entrypoint.sh +++ b/10/alpine/docker-entrypoint.sh @@ -1,27 +1,10 @@ #!/usr/bin/env bash set -e +source /usr/local/bin/docker-common.sh -# usage: file_env VAR [DEFAULT] -# ie: file_env 'XYZ_DB_PASSWORD' 'example' -# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of -# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) -file_env() { - local var="$1" - local fileVar="${var}_FILE" - local def="${2:-}" - if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then - echo >&2 "error: both $var and $fileVar are set (but are exclusive)" - exit 1 - fi - local val="$def" - if [ "${!var:-}" ]; then - val="${!var}" - elif [ "${!fileVar:-}" ]; then - val="$(< "${!fileVar}")" - fi - export "$var"="$val" - unset "$fileVar" -} +if [ "$(id -u)" != '0' ]; then + touch ${LOCK_PATH} +fi if [ "${1:0:1}" = '-' ]; then set -- postgres "$@" @@ -142,4 +125,5 @@ if [ "$1" = 'postgres' ]; then fi fi +rm -f ${LOCK_PATH} > /dev/null || : exec "$@" diff --git a/10/alpine/docker-healthcheck.sh b/10/alpine/docker-healthcheck.sh new file mode 100755 index 0000000000..ae42ee6003 --- /dev/null +++ b/10/alpine/docker-healthcheck.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source /usr/local/bin/docker-common.sh + +# docker-entrypoint starts an postgres temporarily +# ensure the entrypoint script is over +if [ -e ${LOCK_PATH} ]; then + echo "Entrypoint is still running" + exit 1 +fi + +echo "Entrypoint has finished" + +file_env 'POSTGRES_USER' 'postgres' +file_env 'POSTGRES_DB' "$POSTGRES_USER" +file_env 'POSTGRES_PASSWORD' +file_env 'POSTGRES_HEALTH_QUERY' "SELECT 'uptime: ' || now() - pg_postmaster_start_time();" + +pg_isready=(pg_isready) + +if [ "${POSTGRES_USER}" != "" ]; then + pg_isready+=(--username "${POSTGRES_USER}") +fi + +if [ "${POSTGRES_DB}" != "" ]; then + pg_isready+=(--dbname "${POSTGRES_DB}") +fi + +${pg_isready[@]} || exit 1 + +echo "Postgres accepts connections" + +if [ "${POSTGRES_HEALTH_QUERY}" != "" ]; then + health=(psql -t -v ON_ERROR_STOP=1) + + if [ "${POSTGRES_USER}" != "" ]; then + health+=(--username "${POSTGRES_USER}") + fi + + if [ "${POSTGRES_PASSWORD}" != "" ]; then + export PGPASWORD=${POSTGRES_PASSWORD} + fi + + if [ "${POSTGRES_DB}" != "" ]; then + health+=(--dbname "${POSTGRES_DB}") + fi + echo ${POSTGRES_HEALTH_QUERY} | ${health[@]} || exit 1 + echo "Health query succeed" +fi + +exit 0 diff --git a/10/docker-common.sh b/10/docker-common.sh new file mode 100644 index 0000000000..f47406d0c0 --- /dev/null +++ b/10/docker-common.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +LOCK_PATH=/tmp/docker-entrypoint.lock + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + diff --git a/10/docker-entrypoint.sh b/10/docker-entrypoint.sh index a30e6f759a..a4b07b67e9 100755 --- a/10/docker-entrypoint.sh +++ b/10/docker-entrypoint.sh @@ -1,27 +1,10 @@ #!/usr/bin/env bash set -e +source /usr/local/bin/docker-common.sh -# usage: file_env VAR [DEFAULT] -# ie: file_env 'XYZ_DB_PASSWORD' 'example' -# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of -# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) -file_env() { - local var="$1" - local fileVar="${var}_FILE" - local def="${2:-}" - if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then - echo >&2 "error: both $var and $fileVar are set (but are exclusive)" - exit 1 - fi - local val="$def" - if [ "${!var:-}" ]; then - val="${!var}" - elif [ "${!fileVar:-}" ]; then - val="$(< "${!fileVar}")" - fi - export "$var"="$val" - unset "$fileVar" -} +if [ "$(id -u)" != '0' ]; then + touch ${LOCK_PATH} +fi if [ "${1:0:1}" = '-' ]; then set -- postgres "$@" @@ -142,4 +125,5 @@ if [ "$1" = 'postgres' ]; then fi fi +rm -f ${LOCK_PATH} > /dev/null || : exec "$@" diff --git a/10/docker-healthcheck.sh b/10/docker-healthcheck.sh new file mode 100755 index 0000000000..ae42ee6003 --- /dev/null +++ b/10/docker-healthcheck.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source /usr/local/bin/docker-common.sh + +# docker-entrypoint starts an postgres temporarily +# ensure the entrypoint script is over +if [ -e ${LOCK_PATH} ]; then + echo "Entrypoint is still running" + exit 1 +fi + +echo "Entrypoint has finished" + +file_env 'POSTGRES_USER' 'postgres' +file_env 'POSTGRES_DB' "$POSTGRES_USER" +file_env 'POSTGRES_PASSWORD' +file_env 'POSTGRES_HEALTH_QUERY' "SELECT 'uptime: ' || now() - pg_postmaster_start_time();" + +pg_isready=(pg_isready) + +if [ "${POSTGRES_USER}" != "" ]; then + pg_isready+=(--username "${POSTGRES_USER}") +fi + +if [ "${POSTGRES_DB}" != "" ]; then + pg_isready+=(--dbname "${POSTGRES_DB}") +fi + +${pg_isready[@]} || exit 1 + +echo "Postgres accepts connections" + +if [ "${POSTGRES_HEALTH_QUERY}" != "" ]; then + health=(psql -t -v ON_ERROR_STOP=1) + + if [ "${POSTGRES_USER}" != "" ]; then + health+=(--username "${POSTGRES_USER}") + fi + + if [ "${POSTGRES_PASSWORD}" != "" ]; then + export PGPASWORD=${POSTGRES_PASSWORD} + fi + + if [ "${POSTGRES_DB}" != "" ]; then + health+=(--dbname "${POSTGRES_DB}") + fi + echo ${POSTGRES_HEALTH_QUERY} | ${health[@]} || exit 1 + echo "Health query succeed" +fi + +exit 0 diff --git a/9.3/Dockerfile b/9.3/Dockerfile index 3f8b5c0807..c52456c412 100644 --- a/9.3/Dockerfile +++ b/9.3/Dockerfile @@ -126,9 +126,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/9.3/alpine/.Dockerfile.swp b/9.3/alpine/.Dockerfile.swp new file mode 100644 index 0000000000..3b3c5cc45a Binary files /dev/null and b/9.3/alpine/.Dockerfile.swp differ diff --git a/9.3/alpine/Dockerfile b/9.3/alpine/Dockerfile index 12cb52e87a..49897c57b3 100644 --- a/9.3/alpine/Dockerfile +++ b/9.3/alpine/Dockerfile @@ -169,9 +169,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/9.3/alpine/docker-common.sh b/9.3/alpine/docker-common.sh new file mode 100644 index 0000000000..f47406d0c0 --- /dev/null +++ b/9.3/alpine/docker-common.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +LOCK_PATH=/tmp/docker-entrypoint.lock + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + diff --git a/9.3/alpine/docker-entrypoint.sh b/9.3/alpine/docker-entrypoint.sh index 4bc72cb6b4..a686e54705 100755 --- a/9.3/alpine/docker-entrypoint.sh +++ b/9.3/alpine/docker-entrypoint.sh @@ -1,27 +1,10 @@ #!/usr/bin/env bash set -e +source /usr/local/bin/docker-common.sh -# usage: file_env VAR [DEFAULT] -# ie: file_env 'XYZ_DB_PASSWORD' 'example' -# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of -# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) -file_env() { - local var="$1" - local fileVar="${var}_FILE" - local def="${2:-}" - if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then - echo >&2 "error: both $var and $fileVar are set (but are exclusive)" - exit 1 - fi - local val="$def" - if [ "${!var:-}" ]; then - val="${!var}" - elif [ "${!fileVar:-}" ]; then - val="$(< "${!fileVar}")" - fi - export "$var"="$val" - unset "$fileVar" -} +if [ "$(id -u)" != '0' ]; then + touch ${LOCK_PATH} +fi if [ "${1:0:1}" = '-' ]; then set -- postgres "$@" @@ -142,4 +125,5 @@ if [ "$1" = 'postgres' ]; then fi fi +rm -f ${LOCK_PATH} > /dev/null || : exec "$@" diff --git a/9.3/alpine/docker-healthcheck.sh b/9.3/alpine/docker-healthcheck.sh new file mode 100755 index 0000000000..ae42ee6003 --- /dev/null +++ b/9.3/alpine/docker-healthcheck.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source /usr/local/bin/docker-common.sh + +# docker-entrypoint starts an postgres temporarily +# ensure the entrypoint script is over +if [ -e ${LOCK_PATH} ]; then + echo "Entrypoint is still running" + exit 1 +fi + +echo "Entrypoint has finished" + +file_env 'POSTGRES_USER' 'postgres' +file_env 'POSTGRES_DB' "$POSTGRES_USER" +file_env 'POSTGRES_PASSWORD' +file_env 'POSTGRES_HEALTH_QUERY' "SELECT 'uptime: ' || now() - pg_postmaster_start_time();" + +pg_isready=(pg_isready) + +if [ "${POSTGRES_USER}" != "" ]; then + pg_isready+=(--username "${POSTGRES_USER}") +fi + +if [ "${POSTGRES_DB}" != "" ]; then + pg_isready+=(--dbname "${POSTGRES_DB}") +fi + +${pg_isready[@]} || exit 1 + +echo "Postgres accepts connections" + +if [ "${POSTGRES_HEALTH_QUERY}" != "" ]; then + health=(psql -t -v ON_ERROR_STOP=1) + + if [ "${POSTGRES_USER}" != "" ]; then + health+=(--username "${POSTGRES_USER}") + fi + + if [ "${POSTGRES_PASSWORD}" != "" ]; then + export PGPASWORD=${POSTGRES_PASSWORD} + fi + + if [ "${POSTGRES_DB}" != "" ]; then + health+=(--dbname "${POSTGRES_DB}") + fi + echo ${POSTGRES_HEALTH_QUERY} | ${health[@]} || exit 1 + echo "Health query succeed" +fi + +exit 0 diff --git a/9.3/docker-common.sh b/9.3/docker-common.sh new file mode 100644 index 0000000000..f47406d0c0 --- /dev/null +++ b/9.3/docker-common.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +LOCK_PATH=/tmp/docker-entrypoint.lock + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + diff --git a/9.3/docker-entrypoint.sh b/9.3/docker-entrypoint.sh index c96fea538d..63f0d64f33 100755 --- a/9.3/docker-entrypoint.sh +++ b/9.3/docker-entrypoint.sh @@ -1,27 +1,10 @@ #!/usr/bin/env bash set -e +source /usr/local/bin/docker-common.sh -# usage: file_env VAR [DEFAULT] -# ie: file_env 'XYZ_DB_PASSWORD' 'example' -# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of -# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) -file_env() { - local var="$1" - local fileVar="${var}_FILE" - local def="${2:-}" - if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then - echo >&2 "error: both $var and $fileVar are set (but are exclusive)" - exit 1 - fi - local val="$def" - if [ "${!var:-}" ]; then - val="${!var}" - elif [ "${!fileVar:-}" ]; then - val="$(< "${!fileVar}")" - fi - export "$var"="$val" - unset "$fileVar" -} +if [ "$(id -u)" != '0' ]; then + touch ${LOCK_PATH} +fi if [ "${1:0:1}" = '-' ]; then set -- postgres "$@" @@ -142,4 +125,5 @@ if [ "$1" = 'postgres' ]; then fi fi +rm -f ${LOCK_PATH} > /dev/null || : exec "$@" diff --git a/9.3/docker-healthcheck.sh b/9.3/docker-healthcheck.sh new file mode 100755 index 0000000000..ae42ee6003 --- /dev/null +++ b/9.3/docker-healthcheck.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source /usr/local/bin/docker-common.sh + +# docker-entrypoint starts an postgres temporarily +# ensure the entrypoint script is over +if [ -e ${LOCK_PATH} ]; then + echo "Entrypoint is still running" + exit 1 +fi + +echo "Entrypoint has finished" + +file_env 'POSTGRES_USER' 'postgres' +file_env 'POSTGRES_DB' "$POSTGRES_USER" +file_env 'POSTGRES_PASSWORD' +file_env 'POSTGRES_HEALTH_QUERY' "SELECT 'uptime: ' || now() - pg_postmaster_start_time();" + +pg_isready=(pg_isready) + +if [ "${POSTGRES_USER}" != "" ]; then + pg_isready+=(--username "${POSTGRES_USER}") +fi + +if [ "${POSTGRES_DB}" != "" ]; then + pg_isready+=(--dbname "${POSTGRES_DB}") +fi + +${pg_isready[@]} || exit 1 + +echo "Postgres accepts connections" + +if [ "${POSTGRES_HEALTH_QUERY}" != "" ]; then + health=(psql -t -v ON_ERROR_STOP=1) + + if [ "${POSTGRES_USER}" != "" ]; then + health+=(--username "${POSTGRES_USER}") + fi + + if [ "${POSTGRES_PASSWORD}" != "" ]; then + export PGPASWORD=${POSTGRES_PASSWORD} + fi + + if [ "${POSTGRES_DB}" != "" ]; then + health+=(--dbname "${POSTGRES_DB}") + fi + echo ${POSTGRES_HEALTH_QUERY} | ${health[@]} || exit 1 + echo "Health query succeed" +fi + +exit 0 diff --git a/9.4/Dockerfile b/9.4/Dockerfile index 125ba689b2..d1c98cef53 100644 --- a/9.4/Dockerfile +++ b/9.4/Dockerfile @@ -126,9 +126,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/9.4/alpine/Dockerfile b/9.4/alpine/Dockerfile index d586e054cc..d75eac3c57 100644 --- a/9.4/alpine/Dockerfile +++ b/9.4/alpine/Dockerfile @@ -142,9 +142,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/9.4/alpine/docker-common.sh b/9.4/alpine/docker-common.sh new file mode 100644 index 0000000000..f47406d0c0 --- /dev/null +++ b/9.4/alpine/docker-common.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +LOCK_PATH=/tmp/docker-entrypoint.lock + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + diff --git a/9.4/alpine/docker-entrypoint.sh b/9.4/alpine/docker-entrypoint.sh index 4bc72cb6b4..a686e54705 100755 --- a/9.4/alpine/docker-entrypoint.sh +++ b/9.4/alpine/docker-entrypoint.sh @@ -1,27 +1,10 @@ #!/usr/bin/env bash set -e +source /usr/local/bin/docker-common.sh -# usage: file_env VAR [DEFAULT] -# ie: file_env 'XYZ_DB_PASSWORD' 'example' -# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of -# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) -file_env() { - local var="$1" - local fileVar="${var}_FILE" - local def="${2:-}" - if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then - echo >&2 "error: both $var and $fileVar are set (but are exclusive)" - exit 1 - fi - local val="$def" - if [ "${!var:-}" ]; then - val="${!var}" - elif [ "${!fileVar:-}" ]; then - val="$(< "${!fileVar}")" - fi - export "$var"="$val" - unset "$fileVar" -} +if [ "$(id -u)" != '0' ]; then + touch ${LOCK_PATH} +fi if [ "${1:0:1}" = '-' ]; then set -- postgres "$@" @@ -142,4 +125,5 @@ if [ "$1" = 'postgres' ]; then fi fi +rm -f ${LOCK_PATH} > /dev/null || : exec "$@" diff --git a/9.4/alpine/docker-healthcheck.sh b/9.4/alpine/docker-healthcheck.sh new file mode 100755 index 0000000000..ae42ee6003 --- /dev/null +++ b/9.4/alpine/docker-healthcheck.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source /usr/local/bin/docker-common.sh + +# docker-entrypoint starts an postgres temporarily +# ensure the entrypoint script is over +if [ -e ${LOCK_PATH} ]; then + echo "Entrypoint is still running" + exit 1 +fi + +echo "Entrypoint has finished" + +file_env 'POSTGRES_USER' 'postgres' +file_env 'POSTGRES_DB' "$POSTGRES_USER" +file_env 'POSTGRES_PASSWORD' +file_env 'POSTGRES_HEALTH_QUERY' "SELECT 'uptime: ' || now() - pg_postmaster_start_time();" + +pg_isready=(pg_isready) + +if [ "${POSTGRES_USER}" != "" ]; then + pg_isready+=(--username "${POSTGRES_USER}") +fi + +if [ "${POSTGRES_DB}" != "" ]; then + pg_isready+=(--dbname "${POSTGRES_DB}") +fi + +${pg_isready[@]} || exit 1 + +echo "Postgres accepts connections" + +if [ "${POSTGRES_HEALTH_QUERY}" != "" ]; then + health=(psql -t -v ON_ERROR_STOP=1) + + if [ "${POSTGRES_USER}" != "" ]; then + health+=(--username "${POSTGRES_USER}") + fi + + if [ "${POSTGRES_PASSWORD}" != "" ]; then + export PGPASWORD=${POSTGRES_PASSWORD} + fi + + if [ "${POSTGRES_DB}" != "" ]; then + health+=(--dbname "${POSTGRES_DB}") + fi + echo ${POSTGRES_HEALTH_QUERY} | ${health[@]} || exit 1 + echo "Health query succeed" +fi + +exit 0 diff --git a/9.4/docker-common.sh b/9.4/docker-common.sh new file mode 100644 index 0000000000..f47406d0c0 --- /dev/null +++ b/9.4/docker-common.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +LOCK_PATH=/tmp/docker-entrypoint.lock + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + diff --git a/9.4/docker-entrypoint.sh b/9.4/docker-entrypoint.sh index c96fea538d..63f0d64f33 100755 --- a/9.4/docker-entrypoint.sh +++ b/9.4/docker-entrypoint.sh @@ -1,27 +1,10 @@ #!/usr/bin/env bash set -e +source /usr/local/bin/docker-common.sh -# usage: file_env VAR [DEFAULT] -# ie: file_env 'XYZ_DB_PASSWORD' 'example' -# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of -# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) -file_env() { - local var="$1" - local fileVar="${var}_FILE" - local def="${2:-}" - if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then - echo >&2 "error: both $var and $fileVar are set (but are exclusive)" - exit 1 - fi - local val="$def" - if [ "${!var:-}" ]; then - val="${!var}" - elif [ "${!fileVar:-}" ]; then - val="$(< "${!fileVar}")" - fi - export "$var"="$val" - unset "$fileVar" -} +if [ "$(id -u)" != '0' ]; then + touch ${LOCK_PATH} +fi if [ "${1:0:1}" = '-' ]; then set -- postgres "$@" @@ -142,4 +125,5 @@ if [ "$1" = 'postgres' ]; then fi fi +rm -f ${LOCK_PATH} > /dev/null || : exec "$@" diff --git a/9.4/docker-healthcheck.sh b/9.4/docker-healthcheck.sh new file mode 100755 index 0000000000..ae42ee6003 --- /dev/null +++ b/9.4/docker-healthcheck.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source /usr/local/bin/docker-common.sh + +# docker-entrypoint starts an postgres temporarily +# ensure the entrypoint script is over +if [ -e ${LOCK_PATH} ]; then + echo "Entrypoint is still running" + exit 1 +fi + +echo "Entrypoint has finished" + +file_env 'POSTGRES_USER' 'postgres' +file_env 'POSTGRES_DB' "$POSTGRES_USER" +file_env 'POSTGRES_PASSWORD' +file_env 'POSTGRES_HEALTH_QUERY' "SELECT 'uptime: ' || now() - pg_postmaster_start_time();" + +pg_isready=(pg_isready) + +if [ "${POSTGRES_USER}" != "" ]; then + pg_isready+=(--username "${POSTGRES_USER}") +fi + +if [ "${POSTGRES_DB}" != "" ]; then + pg_isready+=(--dbname "${POSTGRES_DB}") +fi + +${pg_isready[@]} || exit 1 + +echo "Postgres accepts connections" + +if [ "${POSTGRES_HEALTH_QUERY}" != "" ]; then + health=(psql -t -v ON_ERROR_STOP=1) + + if [ "${POSTGRES_USER}" != "" ]; then + health+=(--username "${POSTGRES_USER}") + fi + + if [ "${POSTGRES_PASSWORD}" != "" ]; then + export PGPASWORD=${POSTGRES_PASSWORD} + fi + + if [ "${POSTGRES_DB}" != "" ]; then + health+=(--dbname "${POSTGRES_DB}") + fi + echo ${POSTGRES_HEALTH_QUERY} | ${health[@]} || exit 1 + echo "Health query succeed" +fi + +exit 0 diff --git a/9.5/Dockerfile b/9.5/Dockerfile index 1eb3221c25..4e6e5cbf7e 100644 --- a/9.5/Dockerfile +++ b/9.5/Dockerfile @@ -126,9 +126,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/9.5/alpine/Dockerfile b/9.5/alpine/Dockerfile index c43a9af2f6..80f535e600 100644 --- a/9.5/alpine/Dockerfile +++ b/9.5/alpine/Dockerfile @@ -142,9 +142,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/9.5/alpine/docker-common.sh b/9.5/alpine/docker-common.sh new file mode 100644 index 0000000000..f47406d0c0 --- /dev/null +++ b/9.5/alpine/docker-common.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +LOCK_PATH=/tmp/docker-entrypoint.lock + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + diff --git a/9.5/alpine/docker-entrypoint.sh b/9.5/alpine/docker-entrypoint.sh index 4bc72cb6b4..a686e54705 100755 --- a/9.5/alpine/docker-entrypoint.sh +++ b/9.5/alpine/docker-entrypoint.sh @@ -1,27 +1,10 @@ #!/usr/bin/env bash set -e +source /usr/local/bin/docker-common.sh -# usage: file_env VAR [DEFAULT] -# ie: file_env 'XYZ_DB_PASSWORD' 'example' -# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of -# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) -file_env() { - local var="$1" - local fileVar="${var}_FILE" - local def="${2:-}" - if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then - echo >&2 "error: both $var and $fileVar are set (but are exclusive)" - exit 1 - fi - local val="$def" - if [ "${!var:-}" ]; then - val="${!var}" - elif [ "${!fileVar:-}" ]; then - val="$(< "${!fileVar}")" - fi - export "$var"="$val" - unset "$fileVar" -} +if [ "$(id -u)" != '0' ]; then + touch ${LOCK_PATH} +fi if [ "${1:0:1}" = '-' ]; then set -- postgres "$@" @@ -142,4 +125,5 @@ if [ "$1" = 'postgres' ]; then fi fi +rm -f ${LOCK_PATH} > /dev/null || : exec "$@" diff --git a/9.5/alpine/docker-healthcheck.sh b/9.5/alpine/docker-healthcheck.sh new file mode 100755 index 0000000000..ae42ee6003 --- /dev/null +++ b/9.5/alpine/docker-healthcheck.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source /usr/local/bin/docker-common.sh + +# docker-entrypoint starts an postgres temporarily +# ensure the entrypoint script is over +if [ -e ${LOCK_PATH} ]; then + echo "Entrypoint is still running" + exit 1 +fi + +echo "Entrypoint has finished" + +file_env 'POSTGRES_USER' 'postgres' +file_env 'POSTGRES_DB' "$POSTGRES_USER" +file_env 'POSTGRES_PASSWORD' +file_env 'POSTGRES_HEALTH_QUERY' "SELECT 'uptime: ' || now() - pg_postmaster_start_time();" + +pg_isready=(pg_isready) + +if [ "${POSTGRES_USER}" != "" ]; then + pg_isready+=(--username "${POSTGRES_USER}") +fi + +if [ "${POSTGRES_DB}" != "" ]; then + pg_isready+=(--dbname "${POSTGRES_DB}") +fi + +${pg_isready[@]} || exit 1 + +echo "Postgres accepts connections" + +if [ "${POSTGRES_HEALTH_QUERY}" != "" ]; then + health=(psql -t -v ON_ERROR_STOP=1) + + if [ "${POSTGRES_USER}" != "" ]; then + health+=(--username "${POSTGRES_USER}") + fi + + if [ "${POSTGRES_PASSWORD}" != "" ]; then + export PGPASWORD=${POSTGRES_PASSWORD} + fi + + if [ "${POSTGRES_DB}" != "" ]; then + health+=(--dbname "${POSTGRES_DB}") + fi + echo ${POSTGRES_HEALTH_QUERY} | ${health[@]} || exit 1 + echo "Health query succeed" +fi + +exit 0 diff --git a/9.5/docker-common.sh b/9.5/docker-common.sh new file mode 100644 index 0000000000..f47406d0c0 --- /dev/null +++ b/9.5/docker-common.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +LOCK_PATH=/tmp/docker-entrypoint.lock + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + diff --git a/9.5/docker-entrypoint.sh b/9.5/docker-entrypoint.sh index c96fea538d..63f0d64f33 100755 --- a/9.5/docker-entrypoint.sh +++ b/9.5/docker-entrypoint.sh @@ -1,27 +1,10 @@ #!/usr/bin/env bash set -e +source /usr/local/bin/docker-common.sh -# usage: file_env VAR [DEFAULT] -# ie: file_env 'XYZ_DB_PASSWORD' 'example' -# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of -# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) -file_env() { - local var="$1" - local fileVar="${var}_FILE" - local def="${2:-}" - if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then - echo >&2 "error: both $var and $fileVar are set (but are exclusive)" - exit 1 - fi - local val="$def" - if [ "${!var:-}" ]; then - val="${!var}" - elif [ "${!fileVar:-}" ]; then - val="$(< "${!fileVar}")" - fi - export "$var"="$val" - unset "$fileVar" -} +if [ "$(id -u)" != '0' ]; then + touch ${LOCK_PATH} +fi if [ "${1:0:1}" = '-' ]; then set -- postgres "$@" @@ -142,4 +125,5 @@ if [ "$1" = 'postgres' ]; then fi fi +rm -f ${LOCK_PATH} > /dev/null || : exec "$@" diff --git a/9.5/docker-healthcheck.sh b/9.5/docker-healthcheck.sh new file mode 100755 index 0000000000..ae42ee6003 --- /dev/null +++ b/9.5/docker-healthcheck.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source /usr/local/bin/docker-common.sh + +# docker-entrypoint starts an postgres temporarily +# ensure the entrypoint script is over +if [ -e ${LOCK_PATH} ]; then + echo "Entrypoint is still running" + exit 1 +fi + +echo "Entrypoint has finished" + +file_env 'POSTGRES_USER' 'postgres' +file_env 'POSTGRES_DB' "$POSTGRES_USER" +file_env 'POSTGRES_PASSWORD' +file_env 'POSTGRES_HEALTH_QUERY' "SELECT 'uptime: ' || now() - pg_postmaster_start_time();" + +pg_isready=(pg_isready) + +if [ "${POSTGRES_USER}" != "" ]; then + pg_isready+=(--username "${POSTGRES_USER}") +fi + +if [ "${POSTGRES_DB}" != "" ]; then + pg_isready+=(--dbname "${POSTGRES_DB}") +fi + +${pg_isready[@]} || exit 1 + +echo "Postgres accepts connections" + +if [ "${POSTGRES_HEALTH_QUERY}" != "" ]; then + health=(psql -t -v ON_ERROR_STOP=1) + + if [ "${POSTGRES_USER}" != "" ]; then + health+=(--username "${POSTGRES_USER}") + fi + + if [ "${POSTGRES_PASSWORD}" != "" ]; then + export PGPASWORD=${POSTGRES_PASSWORD} + fi + + if [ "${POSTGRES_DB}" != "" ]; then + health+=(--dbname "${POSTGRES_DB}") + fi + echo ${POSTGRES_HEALTH_QUERY} | ${health[@]} || exit 1 + echo "Health query succeed" +fi + +exit 0 diff --git a/9.6/Dockerfile b/9.6/Dockerfile index a6d04c356e..f57f3225dd 100644 --- a/9.6/Dockerfile +++ b/9.6/Dockerfile @@ -126,9 +126,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/9.6/alpine/Dockerfile b/9.6/alpine/Dockerfile index 7cfe22a923..73bc51864c 100644 --- a/9.6/alpine/Dockerfile +++ b/9.6/alpine/Dockerfile @@ -142,9 +142,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/9.6/alpine/docker-common.sh b/9.6/alpine/docker-common.sh new file mode 100644 index 0000000000..f47406d0c0 --- /dev/null +++ b/9.6/alpine/docker-common.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +LOCK_PATH=/tmp/docker-entrypoint.lock + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + diff --git a/9.6/alpine/docker-entrypoint.sh b/9.6/alpine/docker-entrypoint.sh index 4bc72cb6b4..a686e54705 100755 --- a/9.6/alpine/docker-entrypoint.sh +++ b/9.6/alpine/docker-entrypoint.sh @@ -1,27 +1,10 @@ #!/usr/bin/env bash set -e +source /usr/local/bin/docker-common.sh -# usage: file_env VAR [DEFAULT] -# ie: file_env 'XYZ_DB_PASSWORD' 'example' -# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of -# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) -file_env() { - local var="$1" - local fileVar="${var}_FILE" - local def="${2:-}" - if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then - echo >&2 "error: both $var and $fileVar are set (but are exclusive)" - exit 1 - fi - local val="$def" - if [ "${!var:-}" ]; then - val="${!var}" - elif [ "${!fileVar:-}" ]; then - val="$(< "${!fileVar}")" - fi - export "$var"="$val" - unset "$fileVar" -} +if [ "$(id -u)" != '0' ]; then + touch ${LOCK_PATH} +fi if [ "${1:0:1}" = '-' ]; then set -- postgres "$@" @@ -142,4 +125,5 @@ if [ "$1" = 'postgres' ]; then fi fi +rm -f ${LOCK_PATH} > /dev/null || : exec "$@" diff --git a/9.6/alpine/docker-healthcheck.sh b/9.6/alpine/docker-healthcheck.sh new file mode 100755 index 0000000000..ae42ee6003 --- /dev/null +++ b/9.6/alpine/docker-healthcheck.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source /usr/local/bin/docker-common.sh + +# docker-entrypoint starts an postgres temporarily +# ensure the entrypoint script is over +if [ -e ${LOCK_PATH} ]; then + echo "Entrypoint is still running" + exit 1 +fi + +echo "Entrypoint has finished" + +file_env 'POSTGRES_USER' 'postgres' +file_env 'POSTGRES_DB' "$POSTGRES_USER" +file_env 'POSTGRES_PASSWORD' +file_env 'POSTGRES_HEALTH_QUERY' "SELECT 'uptime: ' || now() - pg_postmaster_start_time();" + +pg_isready=(pg_isready) + +if [ "${POSTGRES_USER}" != "" ]; then + pg_isready+=(--username "${POSTGRES_USER}") +fi + +if [ "${POSTGRES_DB}" != "" ]; then + pg_isready+=(--dbname "${POSTGRES_DB}") +fi + +${pg_isready[@]} || exit 1 + +echo "Postgres accepts connections" + +if [ "${POSTGRES_HEALTH_QUERY}" != "" ]; then + health=(psql -t -v ON_ERROR_STOP=1) + + if [ "${POSTGRES_USER}" != "" ]; then + health+=(--username "${POSTGRES_USER}") + fi + + if [ "${POSTGRES_PASSWORD}" != "" ]; then + export PGPASWORD=${POSTGRES_PASSWORD} + fi + + if [ "${POSTGRES_DB}" != "" ]; then + health+=(--dbname "${POSTGRES_DB}") + fi + echo ${POSTGRES_HEALTH_QUERY} | ${health[@]} || exit 1 + echo "Health query succeed" +fi + +exit 0 diff --git a/9.6/docker-common.sh b/9.6/docker-common.sh new file mode 100644 index 0000000000..f47406d0c0 --- /dev/null +++ b/9.6/docker-common.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +LOCK_PATH=/tmp/docker-entrypoint.lock + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + diff --git a/9.6/docker-entrypoint.sh b/9.6/docker-entrypoint.sh index c96fea538d..63f0d64f33 100755 --- a/9.6/docker-entrypoint.sh +++ b/9.6/docker-entrypoint.sh @@ -1,27 +1,10 @@ #!/usr/bin/env bash set -e +source /usr/local/bin/docker-common.sh -# usage: file_env VAR [DEFAULT] -# ie: file_env 'XYZ_DB_PASSWORD' 'example' -# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of -# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) -file_env() { - local var="$1" - local fileVar="${var}_FILE" - local def="${2:-}" - if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then - echo >&2 "error: both $var and $fileVar are set (but are exclusive)" - exit 1 - fi - local val="$def" - if [ "${!var:-}" ]; then - val="${!var}" - elif [ "${!fileVar:-}" ]; then - val="$(< "${!fileVar}")" - fi - export "$var"="$val" - unset "$fileVar" -} +if [ "$(id -u)" != '0' ]; then + touch ${LOCK_PATH} +fi if [ "${1:0:1}" = '-' ]; then set -- postgres "$@" @@ -142,4 +125,5 @@ if [ "$1" = 'postgres' ]; then fi fi +rm -f ${LOCK_PATH} > /dev/null || : exec "$@" diff --git a/9.6/docker-healthcheck.sh b/9.6/docker-healthcheck.sh new file mode 100755 index 0000000000..ae42ee6003 --- /dev/null +++ b/9.6/docker-healthcheck.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source /usr/local/bin/docker-common.sh + +# docker-entrypoint starts an postgres temporarily +# ensure the entrypoint script is over +if [ -e ${LOCK_PATH} ]; then + echo "Entrypoint is still running" + exit 1 +fi + +echo "Entrypoint has finished" + +file_env 'POSTGRES_USER' 'postgres' +file_env 'POSTGRES_DB' "$POSTGRES_USER" +file_env 'POSTGRES_PASSWORD' +file_env 'POSTGRES_HEALTH_QUERY' "SELECT 'uptime: ' || now() - pg_postmaster_start_time();" + +pg_isready=(pg_isready) + +if [ "${POSTGRES_USER}" != "" ]; then + pg_isready+=(--username "${POSTGRES_USER}") +fi + +if [ "${POSTGRES_DB}" != "" ]; then + pg_isready+=(--dbname "${POSTGRES_DB}") +fi + +${pg_isready[@]} || exit 1 + +echo "Postgres accepts connections" + +if [ "${POSTGRES_HEALTH_QUERY}" != "" ]; then + health=(psql -t -v ON_ERROR_STOP=1) + + if [ "${POSTGRES_USER}" != "" ]; then + health+=(--username "${POSTGRES_USER}") + fi + + if [ "${POSTGRES_PASSWORD}" != "" ]; then + export PGPASWORD=${POSTGRES_PASSWORD} + fi + + if [ "${POSTGRES_DB}" != "" ]; then + health+=(--dbname "${POSTGRES_DB}") + fi + echo ${POSTGRES_HEALTH_QUERY} | ${health[@]} || exit 1 + echo "Health query succeed" +fi + +exit 0 diff --git a/Dockerfile-alpine.template b/Dockerfile-alpine.template index a302b4f8bb..d902a3c60f 100644 --- a/Dockerfile-alpine.template +++ b/Dockerfile-alpine.template @@ -144,9 +144,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/Dockerfile-debian.template b/Dockerfile-debian.template index a66cab06c1..9b1042ae32 100644 --- a/Dockerfile-debian.template +++ b/Dockerfile-debian.template @@ -126,9 +126,10 @@ ENV PGDATA /var/lib/postgresql/data RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values) VOLUME /var/lib/postgresql/data -COPY docker-entrypoint.sh /usr/local/bin/ +COPY docker-*.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] +HEALTHCHECK CMD ["docker-healthcheck.sh"] EXPOSE 5432 CMD ["postgres"] diff --git a/docker-common.sh b/docker-common.sh new file mode 100644 index 0000000000..f47406d0c0 --- /dev/null +++ b/docker-common.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +LOCK_PATH=/tmp/docker-entrypoint.lock + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index a30e6f759a..a4b07b67e9 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,27 +1,10 @@ #!/usr/bin/env bash set -e +source /usr/local/bin/docker-common.sh -# usage: file_env VAR [DEFAULT] -# ie: file_env 'XYZ_DB_PASSWORD' 'example' -# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of -# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) -file_env() { - local var="$1" - local fileVar="${var}_FILE" - local def="${2:-}" - if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then - echo >&2 "error: both $var and $fileVar are set (but are exclusive)" - exit 1 - fi - local val="$def" - if [ "${!var:-}" ]; then - val="${!var}" - elif [ "${!fileVar:-}" ]; then - val="$(< "${!fileVar}")" - fi - export "$var"="$val" - unset "$fileVar" -} +if [ "$(id -u)" != '0' ]; then + touch ${LOCK_PATH} +fi if [ "${1:0:1}" = '-' ]; then set -- postgres "$@" @@ -142,4 +125,5 @@ if [ "$1" = 'postgres' ]; then fi fi +rm -f ${LOCK_PATH} > /dev/null || : exec "$@" diff --git a/docker-healthcheck.sh b/docker-healthcheck.sh new file mode 100755 index 0000000000..ae42ee6003 --- /dev/null +++ b/docker-healthcheck.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source /usr/local/bin/docker-common.sh + +# docker-entrypoint starts an postgres temporarily +# ensure the entrypoint script is over +if [ -e ${LOCK_PATH} ]; then + echo "Entrypoint is still running" + exit 1 +fi + +echo "Entrypoint has finished" + +file_env 'POSTGRES_USER' 'postgres' +file_env 'POSTGRES_DB' "$POSTGRES_USER" +file_env 'POSTGRES_PASSWORD' +file_env 'POSTGRES_HEALTH_QUERY' "SELECT 'uptime: ' || now() - pg_postmaster_start_time();" + +pg_isready=(pg_isready) + +if [ "${POSTGRES_USER}" != "" ]; then + pg_isready+=(--username "${POSTGRES_USER}") +fi + +if [ "${POSTGRES_DB}" != "" ]; then + pg_isready+=(--dbname "${POSTGRES_DB}") +fi + +${pg_isready[@]} || exit 1 + +echo "Postgres accepts connections" + +if [ "${POSTGRES_HEALTH_QUERY}" != "" ]; then + health=(psql -t -v ON_ERROR_STOP=1) + + if [ "${POSTGRES_USER}" != "" ]; then + health+=(--username "${POSTGRES_USER}") + fi + + if [ "${POSTGRES_PASSWORD}" != "" ]; then + export PGPASWORD=${POSTGRES_PASSWORD} + fi + + if [ "${POSTGRES_DB}" != "" ]; then + health+=(--dbname "${POSTGRES_DB}") + fi + echo ${POSTGRES_HEALTH_QUERY} | ${health[@]} || exit 1 + echo "Health query succeed" +fi + +exit 0 diff --git a/update.sh b/update.sh index cc8df80244..814b159de8 100755 --- a/update.sh +++ b/update.sh @@ -47,7 +47,7 @@ for version in "${versions[@]}"; do ( set -x - cp docker-entrypoint.sh "$version/" + cp docker-*.sh "$version/" sed -e 's/%%PG_MAJOR%%/'"$version"'/g;' \ -e 's/%%PG_VERSION%%/'"$fullVersion"'/g' \ -e 's/%%DEBIAN_SUITE%%/'"$suite"'/g' \ @@ -78,7 +78,7 @@ for version in "${versions[@]}"; do fi ( set -x - cp docker-entrypoint.sh "$version/$variant/" + cp docker-*.sh "$version/$variant/" sed -i 's/gosu/su-exec/g' "$version/$variant/docker-entrypoint.sh" sed -e 's/%%PG_MAJOR%%/'"$version"'/g' \ -e 's/%%PG_VERSION%%/'"$srcVersion"'/g' \