github.com/rkt/rkt@v1.30.1-0.20200224141603-171c416fac02/Documentation/examples/build-container/postgres/postgres-prestart.sh (about)

     1  #!/bin/bash
     2  
     3  # Adapted from
     4  # https://github.com/docker-library/postgres/blob/b84ddd1/10/docker-entrypoint.sh
     5  # which is under MIT license.
     6  #
     7  # We don't do `exec "$@"` at the end because this script will be executed as a
     8  # pre-start hook (see `acbuild --debug set-event-handler pre-start` in
     9  # `build-postgres.sh`)
    10  
    11  set -e
    12  
    13  # usage: file_env VAR [DEFAULT]
    14  #    ie: file_env 'XYZ_DB_PASSWORD' 'example'
    15  # (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
    16  #  "$XYZ_DB_PASSWORD" from a file)
    17  file_env() {
    18  	local var="$1"
    19  	local fileVar="${var}_FILE"
    20  	local def="${2:-}"
    21  	if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
    22  		echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
    23  		exit 1
    24  	fi
    25  	local val="$def"
    26  	if [ "${!var:-}" ]; then
    27  		val="${!var}"
    28  	elif [ "${!fileVar:-}" ]; then
    29  		val="$(< "${!fileVar}")"
    30  	fi
    31  	export "$var"="$val"
    32  	unset "$fileVar"
    33  }
    34  
    35  if [ "${1:0:1}" = '-' ]; then
    36  	set -- postgres "$@"
    37  fi
    38  
    39  # allow the container to be started with `--user`
    40  if [ "$1" = 'postgres' ] && [ "$(id -u)" = '0' ]; then
    41  	mkdir -p "$PGDATA"
    42  	chown -R postgres "$PGDATA"
    43  	chmod 700 "$PGDATA"
    44  
    45  	mkdir -p /var/run/postgresql
    46  	chown -R postgres /var/run/postgresql
    47  	chmod 775 /var/run/postgresql
    48  
    49  	# Create the transaction log directory before initdb is run (below) so the directory is owned by the correct user
    50  	if [ "$POSTGRES_INITDB_XLOGDIR" ]; then
    51  		mkdir -p "$POSTGRES_INITDB_XLOGDIR"
    52  		chown -R postgres "$POSTGRES_INITDB_XLOGDIR"
    53  		chmod 700 "$POSTGRES_INITDB_XLOGDIR"
    54  	fi
    55  
    56  	exec su postgres -c ""$BASH_SOURCE" "$@""
    57  fi
    58  
    59  if [ "$1" = 'postgres' ]; then
    60  	mkdir -p "$PGDATA"
    61  	chown -R "$(id -u)" "$PGDATA" 2>/dev/null || :
    62  	chmod 700 "$PGDATA" 2>/dev/null || :
    63  
    64  	# look specifically for PG_VERSION, as it is expected in the DB dir
    65  	if [ ! -s "$PGDATA/PG_VERSION" ]; then
    66  		file_env 'POSTGRES_INITDB_ARGS'
    67  		if [ "$POSTGRES_INITDB_XLOGDIR" ]; then
    68  			export POSTGRES_INITDB_ARGS="$POSTGRES_INITDB_ARGS --xlogdir $POSTGRES_INITDB_XLOGDIR"
    69  		fi
    70  		eval "initdb --username=postgres $POSTGRES_INITDB_ARGS"
    71  
    72  		# check password first so we can output the warning before postgres
    73  		# messes it up
    74  		file_env 'POSTGRES_PASSWORD'
    75  		if [ "$POSTGRES_PASSWORD" ]; then
    76  			pass="PASSWORD '$POSTGRES_PASSWORD'"
    77  			authMethod=md5
    78  		else
    79  			# The - option suppresses leading tabs but *not* spaces. :)
    80  			cat >&2 <<-'EOWARN'
    81  				****************************************************
    82  				WARNING: No password has been set for the database.
    83  				         This will allow anyone with access to the
    84  				         Postgres port to access your database. In
    85  				         rkt's default configuration, this is
    86  				         effectively any other container on the same
    87  				         system.
    88  				         Use "--set-env POSTGRES_PASSWORD=password" to set
    89  				         it in "rkt run".
    90  				****************************************************
    91  			EOWARN
    92  
    93  			pass=
    94  			authMethod=trust
    95  		fi
    96  
    97  		{
    98  			echo
    99  			echo "host all all all $authMethod"
   100  		} >> "$PGDATA/pg_hba.conf"
   101  
   102  		# internal start of server in order to allow set-up using psql-client
   103  		# does not listen on external TCP/IP and waits until start finishes
   104  		PGUSER="${PGUSER:-postgres}" \
   105  		pg_ctl -D "$PGDATA" \
   106  			-o "-c listen_addresses='localhost'" \
   107  			-w start
   108  
   109  		file_env 'POSTGRES_USER' 'postgres'
   110  		file_env 'POSTGRES_DB' "$POSTGRES_USER"
   111  
   112  		psql=( psql -v ON_ERROR_STOP=1 )
   113  
   114  		if [ "$POSTGRES_DB" != 'postgres' ]; then
   115  			"${psql[@]}" --username postgres <<-EOSQL
   116  				CREATE DATABASE "$POSTGRES_DB" ;
   117  			EOSQL
   118  			echo
   119  		fi
   120  
   121  		if [ "$POSTGRES_USER" = 'postgres' ]; then
   122  			op='ALTER'
   123  		else
   124  			op='CREATE'
   125  		fi
   126  		"${psql[@]}" --username postgres <<-EOSQL
   127  			$op USER "$POSTGRES_USER" WITH SUPERUSER $pass ;
   128  		EOSQL
   129  		echo
   130  
   131  		psql+=( --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" )
   132  
   133  		if [ -f /customize.sql ]; then
   134  			echo "Using file /customize.sql to configure database"
   135  			"${psql[@]}" -f /customize.sql
   136  		fi
   137  
   138  		PGUSER="${PGUSER:-postgres}" \
   139  		pg_ctl -D "$PGDATA" -m fast -w stop
   140  
   141  		# configure postgres to listen on every interface
   142  		sed -ri "s!^#?(listen_addresses)\s*=\s*\S+.*!\1 = '*'!" /var/lib/postgresql/data/postgresql.conf
   143  
   144  		echo
   145  		echo 'PostgreSQL init process complete; ready for start up.'
   146  		echo
   147  	fi
   148  fi