1
1
#! /bin/bash
2
- set -e
2
+
3
+ # Backwards compatibility for old variable names (deprecated)
4
+ if [ " x$PGUSER " != " x" ]; then
5
+ POSTGRES_USER=$PGUSER
6
+ fi
7
+ if [ " x$PGPASSWORD " != " x" ]; then
8
+ POSTGRES_PASSWORD=$PGPASSWORD
9
+ fi
3
10
4
11
# Based on official postgres package's entrypoint script (https://hub.docker.com/_/postgres/)
5
12
# Modified to be able to set up a slave. The docker-entrypoint-initdb.d hook provided is inadequate.
6
13
7
- set_listen_addresses () {
8
- sedEscapedValue=" $( echo " $1 " | sed ' s/[\/&]/\\&/g' ) "
9
- sed -ri " s/^#?(listen_addresses\s*=\s*)\S+/\1'$sedEscapedValue '/" " $PGDATA /postgresql.conf"
10
- }
14
+ set -e
15
+
16
+ if [ " ${1: 0: 1} " = ' -' ]; then
17
+ set -- postgres " $@ "
18
+ fi
11
19
12
20
if [ " $1 " = ' postgres' ]; then
13
21
mkdir -p " $PGDATA "
22
+ chmod 700 " $PGDATA "
14
23
chown -R postgres " $PGDATA "
15
24
16
25
chmod g+s /run/postgresql
@@ -19,25 +28,24 @@ if [ "$1" = 'postgres' ]; then
19
28
# look specifically for PG_VERSION, as it is expected in the DB dir
20
29
if [ ! -s " $PGDATA /PG_VERSION" ]; then
21
30
if [ " x$REPLICATE_FROM " == " x" ]; then
22
- gosu postgres initdb
23
- else
24
- until ping -c 1 -W 1 ${REPLICATE_FROM}
25
- do
26
- echo " Waiting for master to ping..."
27
- sleep 1s
28
- done
29
- until gosu postgres pg_basebackup -h ${REPLICATE_FROM} -D ${PGDATA} -U ${PGUSER} -vP
30
- do
31
- echo " Waiting for master to connect..."
32
- sleep 1s
33
- done
34
- chmod 700 ${PGDATA}
35
- fi
31
+ eval " gosu postgres initdb $POSTGRES_INITDB_ARGS "
32
+ else
33
+ until ping -c 1 -W 1 ${REPLICATE_FROM}
34
+ do
35
+ echo " Waiting for master to ping..."
36
+ sleep 1s
37
+ done
38
+ until gosu postgres pg_basebackup -h ${REPLICATE_FROM} -D ${PGDATA} -U ${POSTGRES_USER} -vP
39
+ do
40
+ echo " Waiting for master to connect..."
41
+ sleep 1s
42
+ done
43
+ fi
36
44
37
45
# check password first so we can output the warning before postgres
38
46
# messes it up
39
- if [ " $PGPASSWORD " ]; then
40
- pass=" PASSWORD '$PGPASSWORD '"
47
+ if [ " $POSTGRES_PASSWORD " ]; then
48
+ pass=" PASSWORD '$POSTGRES_PASSWORD '"
41
49
authMethod=md5
42
50
else
43
51
# The - option suppresses leading tabs but *not* spaces. :)
@@ -50,7 +58,7 @@ if [ "$1" = 'postgres' ]; then
50
58
effectively any other container on the same
51
59
system.
52
60
53
- Use "-e PGPASSWORD =password" to set
61
+ Use "-e POSTGRES_PASSWORD =password" to set
54
62
it in "docker run".
55
63
****************************************************
56
64
EOWARN
@@ -65,49 +73,52 @@ if [ "$1" = 'postgres' ]; then
65
73
{ echo ; echo " host all all 0.0.0.0/0 $authMethod " ; } >> " $PGDATA /pg_hba.conf"
66
74
67
75
# internal start of server in order to allow set-up using psql-client
68
- # does not listen on TCP/IP and waits until start finishes
76
+ # does not listen on external TCP/IP and waits until start finishes
69
77
gosu postgres pg_ctl -D " $PGDATA " \
70
- -o " -c listen_addresses=''" \
78
+ -o " -c listen_addresses='localhost '" \
71
79
-w start
72
80
73
- : ${PGUSER:= postgres}
74
- : ${POSTGRES_DB:= $PGUSER }
75
- export PGUSER POSTGRES_DB
81
+ : ${POSTGRES_USER:= postgres}
82
+ : ${POSTGRES_DB:= $POSTGRES_USER }
83
+ export POSTGRES_USER POSTGRES_DB
84
+
85
+ psql=( psql -v ON_ERROR_STOP=1 )
76
86
77
87
if [ " $POSTGRES_DB " != ' postgres' ]; then
78
- psql --username postgres << -EOSQL
88
+ " ${ psql[@]} " --username postgres << -EOSQL
79
89
CREATE DATABASE "$POSTGRES_DB " ;
80
90
EOSQL
81
91
echo
82
92
fi
83
93
84
- if [ " $PGUSER " = ' postgres' ]; then
94
+ if [ " $POSTGRES_USER " = ' postgres' ]; then
85
95
op=' ALTER'
86
96
else
87
97
op=' CREATE'
88
98
fi
89
-
90
- psql --username postgres << -EOSQL
91
- $op USER "$PGUSER " WITH SUPERUSER $pass ;
99
+ " ${psql[@]} " --username postgres << -EOSQL
100
+ $op USER "$POSTGRES_USER " WITH SUPERUSER $pass ;
92
101
EOSQL
93
102
echo
103
+
104
+ fi
94
105
95
- fi
106
+ psql+=( --username " $POSTGRES_USER " --dbname " $POSTGRES_DB " )
96
107
97
108
echo
98
109
for f in /docker-entrypoint-initdb.d/* ; do
99
110
case " $f " in
100
- * .sh) echo " $0 : running $f " ; . " $f " ;;
101
- * .sql) echo " $0 : running $f " ; psql --username " $PGUSER " --dbname " $POSTGRES_DB " < " $f " && echo ;;
102
- * ) echo " $0 : ignoring $f " ;;
111
+ * .sh) echo " $0 : running $f " ; . " $f " ;;
112
+ * .sql) echo " $0 : running $f " ; " ${psql[@]} " < " $f " ; echo ;;
113
+ * .sql.gz) echo " $0 : running $f " ; gunzip -c " $f " | " ${psql[@]} " ; echo ;;
114
+ * ) echo " $0 : ignoring $f " ;;
103
115
esac
104
116
echo
105
117
done
106
118
107
- if [ " x$REPLICATE_FROM " == " x" ]; then
119
+ if [ " x$REPLICATE_FROM " == " x" ]; then
108
120
gosu postgres pg_ctl -D " $PGDATA " -m fast -w stop
109
- fi
110
- set_listen_addresses ' *'
121
+ fi
111
122
112
123
echo
113
124
echo ' PostgreSQL init process complete; ready for start up.'
0 commit comments