postgres/files/docker-entrypoint.sh
2025-03-16 21:30:46 +01:00

74 lines
No EOL
2 KiB
Bash

#!/bin/sh
# Initialize and configure PostgreSQL database
#
# This script initializes a new PostgreSQL database if it doesn't exist,
# configures user authentication, and runs any initialization scripts.
#
# Environment variables:
# PGDATA: PostgreSQL data directory
# POSTGRES_USER: PostgreSQL user (default: postgres)
# POSTGRES_DB: Database name (default: same as POSTGRES_USER)
# POSTGRES_PASSWORD: User password (optional)
#
# Returns:
# None. Exits with status 0 on success, non-zero on failure.
chown -R postgres "$PGDATA"
if [ -z "$(ls -A "$PGDATA")" ]; then
su-exec postgres initdb
sed -ri "s/^#(listen_addresses\s*=\s*)\S+/\1'*'/" "$PGDATA"/postgresql.conf
: ${POSTGRES_USER:="postgres"}
: ${POSTGRES_DB:=$POSTGRES_USER}
if [ "$POSTGRES_PASSWORD" ]; then
pass="PASSWORD '$POSTGRES_PASSWORD'"
authMethod=md5
else
echo "==============================="
echo "!!! NO PASSWORD SET !!! (Use \$POSTGRES_PASSWORD env var)"
echo "==============================="
pass=
authMethod=trust
fi
echo
if [ "$POSTGRES_DB" != 'postgres' ]; then
createSql="CREATE DATABASE $POSTGRES_DB;"
echo $createSql | su-exec postgres postgres --single -jE
echo
fi
if [ "$POSTGRES_USER" != 'postgres' ]; then
op=CREATE
else
op=ALTER
fi
userSql="$op USER $POSTGRES_USER WITH SUPERUSER $pass;"
echo $userSql | su-exec postgres postgres --single -jE
echo
su-exec postgres pg_ctl -D "$PGDATA" \
-o "-c listen_addresses=''" \
-w start
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_USER" --dbname "$POSTGRES_DB" < "$f" && echo ;;
*) echo "$0: ignoring $f" ;;
esac
echo
done
su-exec postgres pg_ctl -D "$PGDATA" -m fast -w stop
{ echo; echo "host all all 0.0.0.0/0 $authMethod"; } >> "$PGDATA"/pg_hba.conf
fi
exec su-exec postgres "$@"