diff --git a/.travis.yml b/.travis.yml index 0d8050ad3a..4d42c33963 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,11 @@ services: docker env: - VERSION=9.6 + - VERSION=9.6 VARIANT=alpine - VERSION=9.5 + - VERSION=9.5 VARIANT=alpine - VERSION=9.4 + - VERSION=9.4 VARIANT=alpine - VERSION=9.3 - VERSION=9.2 - VERSION=9.1 @@ -14,8 +17,8 @@ install: before_script: - env | sort - - cd "$VERSION" - - image="postgres:$VERSION" + - cd "$VERSION/$VARIANT" + - image="postgres:${VERSION}${VARIANT:+-${VARIANT}}" script: - docker build -t "$image" . diff --git a/9.4/alpine/Dockerfile b/9.4/alpine/Dockerfile new file mode 100644 index 0000000000..43d1554572 --- /dev/null +++ b/9.4/alpine/Dockerfile @@ -0,0 +1,14 @@ +FROM alpine:3.3 + +RUN apk update && apk add su-exec postgresql && rm -rf /var/cache/apk/* + +ENV LANG en_US.utf8 +ENV PGDATA /var/lib/postgresql/data +VOLUME /var/lib/postgresql/data + +COPY docker-entrypoint.sh / + +ENTRYPOINT ["/docker-entrypoint.sh"] + +EXPOSE 5432 +CMD ["postgres"] diff --git a/9.4/alpine/docker-entrypoint.sh b/9.4/alpine/docker-entrypoint.sh new file mode 100755 index 0000000000..ff1b4ba2d0 --- /dev/null +++ b/9.4/alpine/docker-entrypoint.sh @@ -0,0 +1,96 @@ +#!/bin/sh +set -e + +if [ "${1:0:1}" = '-' ]; then + set -- postgres "$@" +fi + +if [ "$1" = 'postgres' ]; then + mkdir -p "$PGDATA" + chmod 700 "$PGDATA" + chown -R postgres "$PGDATA" + + mkdir -p /run/postgresql + chmod g+s /run/postgresql + chown -R postgres /run/postgresql + + # look specifically for PG_VERSION, as it is expected in the DB dir + if [ ! -s "$PGDATA/PG_VERSION" ]; then + eval "su-exec postgres initdb $POSTGRES_INITDB_ARGS" + + # check password first so we can output the warning before postgres + # messes it up + if [ "$POSTGRES_PASSWORD" ]; then + pass="PASSWORD '$POSTGRES_PASSWORD'" + authMethod=md5 + else + # The - option suppresses leading tabs but *not* spaces. :) + cat >&2 <<-'EOWARN' + **************************************************** + WARNING: No password has been set for the database. + This will allow anyone with access to the + Postgres port to access your database. In + Docker's default configuration, this is + effectively any other container on the same + system. + + Use "-e POSTGRES_PASSWORD=password" to set + it in "docker run". + **************************************************** + EOWARN + + pass= + authMethod=trust + fi + + { echo; echo "host all all 0.0.0.0/0 $authMethod"; } >> "$PGDATA/pg_hba.conf" + + # internal start of server in order to allow set-up using psql-client + # does not listen on external TCP/IP and waits until start finishes + su-exec postgres pg_ctl -D "$PGDATA" \ + -o "-c listen_addresses='localhost'" \ + -w start + + : ${POSTGRES_USER:=postgres} + : ${POSTGRES_DB:=$POSTGRES_USER} + export POSTGRES_USER POSTGRES_DB + + if [ "$POSTGRES_DB" != 'postgres' ]; then + psql -v ON_ERROR_STOP=1 --username postgres <<-EOSQL + CREATE DATABASE "$POSTGRES_DB" ; + EOSQL + echo + fi + + if [ "$POSTGRES_USER" = 'postgres' ]; then + op='ALTER' + else + op='CREATE' + fi + psql -v ON_ERROR_STOP=1 --username postgres <<-EOSQL + $op USER "$POSTGRES_USER" WITH SUPERUSER $pass ; + EOSQL + echo + + echo + for f in /docker-entrypoint-initdb.d/*; do + case "$f" in + *.sh) echo "$0: running $f"; . "$f" ;; + *.sql) echo "$0: running $f"; psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < "$f"; echo ;; + *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB"; echo ;; + *) echo "$0: ignoring $f" ;; + esac + echo + done + + su-exec postgres pg_ctl -D "$PGDATA" -m fast -w stop + + echo + echo 'PostgreSQL init process complete; ready for start up.' + echo + fi + + exec su-exec postgres "$@" +fi + +exec "$@" diff --git a/9.5/alpine/Dockerfile b/9.5/alpine/Dockerfile new file mode 100644 index 0000000000..ec75d10cd1 --- /dev/null +++ b/9.5/alpine/Dockerfile @@ -0,0 +1,14 @@ +FROM alpine:3.4 + +RUN apk update && apk add su-exec postgresql && rm -rf /var/cache/apk/* + +ENV LANG en_US.utf8 +ENV PGDATA /var/lib/postgresql/data +VOLUME /var/lib/postgresql/data + +COPY docker-entrypoint.sh / + +ENTRYPOINT ["/docker-entrypoint.sh"] + +EXPOSE 5432 +CMD ["postgres"] diff --git a/9.5/alpine/docker-entrypoint.sh b/9.5/alpine/docker-entrypoint.sh new file mode 100755 index 0000000000..ff1b4ba2d0 --- /dev/null +++ b/9.5/alpine/docker-entrypoint.sh @@ -0,0 +1,96 @@ +#!/bin/sh +set -e + +if [ "${1:0:1}" = '-' ]; then + set -- postgres "$@" +fi + +if [ "$1" = 'postgres' ]; then + mkdir -p "$PGDATA" + chmod 700 "$PGDATA" + chown -R postgres "$PGDATA" + + mkdir -p /run/postgresql + chmod g+s /run/postgresql + chown -R postgres /run/postgresql + + # look specifically for PG_VERSION, as it is expected in the DB dir + if [ ! -s "$PGDATA/PG_VERSION" ]; then + eval "su-exec postgres initdb $POSTGRES_INITDB_ARGS" + + # check password first so we can output the warning before postgres + # messes it up + if [ "$POSTGRES_PASSWORD" ]; then + pass="PASSWORD '$POSTGRES_PASSWORD'" + authMethod=md5 + else + # The - option suppresses leading tabs but *not* spaces. :) + cat >&2 <<-'EOWARN' + **************************************************** + WARNING: No password has been set for the database. + This will allow anyone with access to the + Postgres port to access your database. In + Docker's default configuration, this is + effectively any other container on the same + system. + + Use "-e POSTGRES_PASSWORD=password" to set + it in "docker run". + **************************************************** + EOWARN + + pass= + authMethod=trust + fi + + { echo; echo "host all all 0.0.0.0/0 $authMethod"; } >> "$PGDATA/pg_hba.conf" + + # internal start of server in order to allow set-up using psql-client + # does not listen on external TCP/IP and waits until start finishes + su-exec postgres pg_ctl -D "$PGDATA" \ + -o "-c listen_addresses='localhost'" \ + -w start + + : ${POSTGRES_USER:=postgres} + : ${POSTGRES_DB:=$POSTGRES_USER} + export POSTGRES_USER POSTGRES_DB + + if [ "$POSTGRES_DB" != 'postgres' ]; then + psql -v ON_ERROR_STOP=1 --username postgres <<-EOSQL + CREATE DATABASE "$POSTGRES_DB" ; + EOSQL + echo + fi + + if [ "$POSTGRES_USER" = 'postgres' ]; then + op='ALTER' + else + op='CREATE' + fi + psql -v ON_ERROR_STOP=1 --username postgres <<-EOSQL + $op USER "$POSTGRES_USER" WITH SUPERUSER $pass ; + EOSQL + echo + + echo + for f in /docker-entrypoint-initdb.d/*; do + case "$f" in + *.sh) echo "$0: running $f"; . "$f" ;; + *.sql) echo "$0: running $f"; psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < "$f"; echo ;; + *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB"; echo ;; + *) echo "$0: ignoring $f" ;; + esac + echo + done + + su-exec postgres pg_ctl -D "$PGDATA" -m fast -w stop + + echo + echo 'PostgreSQL init process complete; ready for start up.' + echo + fi + + exec su-exec postgres "$@" +fi + +exec "$@" diff --git a/9.6/alpine/Dockerfile b/9.6/alpine/Dockerfile new file mode 100644 index 0000000000..38277f8cd1 --- /dev/null +++ b/9.6/alpine/Dockerfile @@ -0,0 +1,15 @@ +FROM alpine:3.4 + +RUN echo "@edge http://nl.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories && \ + apk update && apk add su-exec postgresql@edge && rm -rf /var/cache/apk/* + +ENV LANG en_US.utf8 +ENV PGDATA /var/lib/postgresql/data +VOLUME /var/lib/postgresql/data + +COPY docker-entrypoint.sh / + +ENTRYPOINT ["/docker-entrypoint.sh"] + +EXPOSE 5432 +CMD ["postgres"] diff --git a/9.6/alpine/docker-entrypoint.sh b/9.6/alpine/docker-entrypoint.sh new file mode 100755 index 0000000000..ff1b4ba2d0 --- /dev/null +++ b/9.6/alpine/docker-entrypoint.sh @@ -0,0 +1,96 @@ +#!/bin/sh +set -e + +if [ "${1:0:1}" = '-' ]; then + set -- postgres "$@" +fi + +if [ "$1" = 'postgres' ]; then + mkdir -p "$PGDATA" + chmod 700 "$PGDATA" + chown -R postgres "$PGDATA" + + mkdir -p /run/postgresql + chmod g+s /run/postgresql + chown -R postgres /run/postgresql + + # look specifically for PG_VERSION, as it is expected in the DB dir + if [ ! -s "$PGDATA/PG_VERSION" ]; then + eval "su-exec postgres initdb $POSTGRES_INITDB_ARGS" + + # check password first so we can output the warning before postgres + # messes it up + if [ "$POSTGRES_PASSWORD" ]; then + pass="PASSWORD '$POSTGRES_PASSWORD'" + authMethod=md5 + else + # The - option suppresses leading tabs but *not* spaces. :) + cat >&2 <<-'EOWARN' + **************************************************** + WARNING: No password has been set for the database. + This will allow anyone with access to the + Postgres port to access your database. In + Docker's default configuration, this is + effectively any other container on the same + system. + + Use "-e POSTGRES_PASSWORD=password" to set + it in "docker run". + **************************************************** + EOWARN + + pass= + authMethod=trust + fi + + { echo; echo "host all all 0.0.0.0/0 $authMethod"; } >> "$PGDATA/pg_hba.conf" + + # internal start of server in order to allow set-up using psql-client + # does not listen on external TCP/IP and waits until start finishes + su-exec postgres pg_ctl -D "$PGDATA" \ + -o "-c listen_addresses='localhost'" \ + -w start + + : ${POSTGRES_USER:=postgres} + : ${POSTGRES_DB:=$POSTGRES_USER} + export POSTGRES_USER POSTGRES_DB + + if [ "$POSTGRES_DB" != 'postgres' ]; then + psql -v ON_ERROR_STOP=1 --username postgres <<-EOSQL + CREATE DATABASE "$POSTGRES_DB" ; + EOSQL + echo + fi + + if [ "$POSTGRES_USER" = 'postgres' ]; then + op='ALTER' + else + op='CREATE' + fi + psql -v ON_ERROR_STOP=1 --username postgres <<-EOSQL + $op USER "$POSTGRES_USER" WITH SUPERUSER $pass ; + EOSQL + echo + + echo + for f in /docker-entrypoint-initdb.d/*; do + case "$f" in + *.sh) echo "$0: running $f"; . "$f" ;; + *.sql) echo "$0: running $f"; psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < "$f"; echo ;; + *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB"; echo ;; + *) echo "$0: ignoring $f" ;; + esac + echo + done + + su-exec postgres pg_ctl -D "$PGDATA" -m fast -w stop + + echo + echo 'PostgreSQL init process complete; ready for start up.' + echo + fi + + exec su-exec postgres "$@" +fi + +exec "$@"