Permalink
Browse files

Improve initdb logic to properly source *.sql files as well, without …

…the use of --single
  • Loading branch information...
tianon committed Jul 23, 2015
1 parent 0ced079 commit 66c7b2dee78980482b83337d16febc4251cb2ae7
Showing with 308 additions and 70 deletions.
  1. +44 −10 9.0/docker-entrypoint.sh
  2. +44 −10 9.1/docker-entrypoint.sh
  3. +44 −10 9.2/docker-entrypoint.sh
  4. +44 −10 9.3/docker-entrypoint.sh
  5. +44 −10 9.4/docker-entrypoint.sh
  6. +44 −10 9.5/docker-entrypoint.sh
  7. +44 −10 docker-entrypoint.sh
View
@@ -1,19 +1,22 @@
#!/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:postgres /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
- sed -ri "s/^#(listen_addresses\s*=\s*)\S+/\1'*'/" "$PGDATA"/postgresql.conf
-
# check password first so we can output the warning before postgres
# messes it up
if [ "$POSTGRES_PASSWORD" ]; then
@@ -39,11 +42,29 @@ if [ "$1" = 'postgres' ]; then
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
- gosu postgres postgres --single -jE <<-EOSQL
+ psql --username postgres <<-EOSQL
CREATE DATABASE "$POSTGRES_DB" ;
EOSQL
echo
@@ -55,18 +76,31 @@ if [ "$1" = 'postgres' ]; then
op='CREATE'
fi
- gosu postgres postgres --single -jE <<-EOSQL
+ psql --username postgres <<-EOSQL
$op USER "$POSTGRES_USER" WITH SUPERUSER $pass ;
EOSQL
echo
- { echo; echo "host all all 0.0.0.0/0 $authMethod"; } >> "$PGDATA"/pg_hba.conf
+ 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 [ -d /docker-entrypoint-initdb.d ]; then
- for f in /docker-entrypoint-initdb.d/*.sh; do
- [ -f "$f" ] && . "$f"
- 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 "$@"
View
@@ -1,19 +1,22 @@
#!/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:postgres /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
- sed -ri "s/^#(listen_addresses\s*=\s*)\S+/\1'*'/" "$PGDATA"/postgresql.conf
-
# check password first so we can output the warning before postgres
# messes it up
if [ "$POSTGRES_PASSWORD" ]; then
@@ -39,11 +42,29 @@ if [ "$1" = 'postgres' ]; then
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
- gosu postgres postgres --single -jE <<-EOSQL
+ psql --username postgres <<-EOSQL
CREATE DATABASE "$POSTGRES_DB" ;
EOSQL
echo
@@ -55,18 +76,31 @@ if [ "$1" = 'postgres' ]; then
op='CREATE'
fi
- gosu postgres postgres --single -jE <<-EOSQL
+ psql --username postgres <<-EOSQL
$op USER "$POSTGRES_USER" WITH SUPERUSER $pass ;
EOSQL
echo
- { echo; echo "host all all 0.0.0.0/0 $authMethod"; } >> "$PGDATA"/pg_hba.conf
+ 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 [ -d /docker-entrypoint-initdb.d ]; then
- for f in /docker-entrypoint-initdb.d/*.sh; do
- [ -f "$f" ] && . "$f"
- 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 "$@"
View
@@ -1,19 +1,22 @@
#!/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:postgres /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
- sed -ri "s/^#(listen_addresses\s*=\s*)\S+/\1'*'/" "$PGDATA"/postgresql.conf
-
# check password first so we can output the warning before postgres
# messes it up
if [ "$POSTGRES_PASSWORD" ]; then
@@ -39,11 +42,29 @@ if [ "$1" = 'postgres' ]; then
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
- gosu postgres postgres --single -jE <<-EOSQL
+ psql --username postgres <<-EOSQL
CREATE DATABASE "$POSTGRES_DB" ;
EOSQL
echo
@@ -55,18 +76,31 @@ if [ "$1" = 'postgres' ]; then
op='CREATE'
fi
- gosu postgres postgres --single -jE <<-EOSQL
+ psql --username postgres <<-EOSQL
$op USER "$POSTGRES_USER" WITH SUPERUSER $pass ;
EOSQL
echo
- { echo; echo "host all all 0.0.0.0/0 $authMethod"; } >> "$PGDATA"/pg_hba.conf
+ 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 [ -d /docker-entrypoint-initdb.d ]; then
- for f in /docker-entrypoint-initdb.d/*.sh; do
- [ -f "$f" ] && . "$f"
- 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 "$@"
View
@@ -1,19 +1,22 @@
#!/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:postgres /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
- sed -ri "s/^#(listen_addresses\s*=\s*)\S+/\1'*'/" "$PGDATA"/postgresql.conf
-
# check password first so we can output the warning before postgres
# messes it up
if [ "$POSTGRES_PASSWORD" ]; then
@@ -39,11 +42,29 @@ if [ "$1" = 'postgres' ]; then
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
- gosu postgres postgres --single -jE <<-EOSQL
+ psql --username postgres <<-EOSQL
CREATE DATABASE "$POSTGRES_DB" ;
EOSQL
echo
@@ -55,18 +76,31 @@ if [ "$1" = 'postgres' ]; then
op='CREATE'
fi
- gosu postgres postgres --single -jE <<-EOSQL
+ psql --username postgres <<-EOSQL
$op USER "$POSTGRES_USER" WITH SUPERUSER $pass ;
EOSQL
echo
- { echo; echo "host all all 0.0.0.0/0 $authMethod"; } >> "$PGDATA"/pg_hba.conf
+ 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 [ -d /docker-entrypoint-initdb.d ]; then
- for f in /docker-entrypoint-initdb.d/*.sh; do
- [ -f "$f" ] && . "$f"
- 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 "$@"
Oops, something went wrong.

0 comments on commit 66c7b2d

Please sign in to comment.