#!/bin/bash set -e set_listen_addresses() { sedEscapedValue="$(echo "$1" | sed 's/[\/&]/\\&/g')" sed -ri "s/^#?(listen_addresses\s*=\s*)\S+/\1'$sedEscapedValue'/" "$PGDATA/postgresql.conf" } if [ "$1" = 'postgres' ]; then mkdir -p "$PGDATA" chown -R postgres "$PGDATA" 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 gosu postgres initdb # 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" set_listen_addresses '' # we're going to start up postgres, but it's not ready for use yet (this is initialization), so don't listen to the outside world yet gosu postgres "$@" & pid="$!" for i in {30..0}; do if echo 'SELECT 1' | psql --username postgres &> /dev/null; then break fi echo 'PostgreSQL init process in progress...' sleep 1 done if [ "$i" = 0 ]; then echo >&2 'PostgreSQL init process failed' exit 1 fi : ${POSTGRES_USER:=postgres} : ${POSTGRES_DB:=$POSTGRES_USER} if [ "$POSTGRES_DB" != 'postgres' ]; then psql --username postgres <<-EOSQL CREATE DATABASE "$POSTGRES_DB" ; EOSQL echo fi if [ "$POSTGRES_USER" = 'postgres' ]; then op='ALTER' else op='CREATE' fi psql --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 --username postgres --dbname "$POSTGRES_DB" < "$f" && echo ;; *) echo "$0: ignoring $f" ;; esac echo done if ! kill -s TERM "$pid" || ! wait "$pid"; then echo >&2 'PostgreSQL init process failed' exit 1 fi set_listen_addresses '*' echo echo 'PostgreSQL init process complete; ready for start up.' echo fi exec gosu postgres "$@" fi exec "$@"