mirror of
https://github.com/wassname/docker-postgresql.git
synced 2026-09-10 12:00:18 +08:00
set PG_CONFDIR to ${PG_HOME}/${PG_VERSION}/main
Database initialization and migration tasks need to be done before performing any configuration bits
This commit is contained in:
+2
-2
@@ -7,8 +7,8 @@ ENV PG_VERSION=9.4 \
|
|||||||
PG_RUNDIR=/run/postgresql \
|
PG_RUNDIR=/run/postgresql \
|
||||||
PG_LOGDIR=/var/log/postgresql
|
PG_LOGDIR=/var/log/postgresql
|
||||||
|
|
||||||
ENV PG_CONFDIR="/etc/postgresql/${PG_VERSION}/main" \
|
ENV PG_BINDIR="/usr/lib/postgresql/${PG_VERSION}/bin" \
|
||||||
PG_BINDIR="/usr/lib/postgresql/${PG_VERSION}/bin" \
|
PG_CONFDIR="${PG_HOME}/${PG_VERSION}/main" \
|
||||||
PG_DATADIR="${PG_HOME}/${PG_VERSION}/main"
|
PG_DATADIR="${PG_HOME}/${PG_VERSION}/main"
|
||||||
|
|
||||||
RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
|
RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
|
||||||
|
|||||||
+79
-79
@@ -61,6 +61,73 @@ create_data_dir
|
|||||||
create_log_dir
|
create_log_dir
|
||||||
create_run_dir
|
create_run_dir
|
||||||
|
|
||||||
|
cd ${PG_HOME}
|
||||||
|
|
||||||
|
# initialize PostgreSQL data directory
|
||||||
|
if [[ ! -d ${PG_DATADIR} ]]; then
|
||||||
|
if [[ ${PSQL_MODE} == slave || ${PSQL_MODE} == snapshot ]]; then
|
||||||
|
echo "Replicating database..."
|
||||||
|
if [[ ${PSQL_MODE} == snapshot ]]; then
|
||||||
|
sudo -Hu ${PG_USER} \
|
||||||
|
PGPASSWORD=$REPLICATION_PASS ${PG_BINDIR}/pg_basebackup -D ${PG_DATADIR} \
|
||||||
|
-h ${REPLICATION_HOST} -p ${REPLICATION_PORT} -U ${REPLICATION_USER} -w -x -v -P
|
||||||
|
elif [[ ${PSQL_MODE} == slave ]]; then
|
||||||
|
# Setup streaming replication.
|
||||||
|
sudo -Hu ${PG_USER} \
|
||||||
|
PGPASSWORD=$REPLICATION_PASS ${PG_BINDIR}/pg_basebackup -D ${PG_DATADIR} \
|
||||||
|
-h ${REPLICATION_HOST} -p ${REPLICATION_PORT} -U ${REPLICATION_USER} -X stream -w -v -P
|
||||||
|
echo "Setting up hot standby configuration..."
|
||||||
|
cat >> ${PG_CONFDIR}/postgresql.conf <<EOF
|
||||||
|
hot_standby = on
|
||||||
|
EOF
|
||||||
|
sudo -Hu ${PG_USER} touch ${PG_DATADIR}/recovery.conf
|
||||||
|
cat >> ${PG_DATADIR}/recovery.conf <<EOF
|
||||||
|
standby_mode = 'on'
|
||||||
|
primary_conninfo = 'host=${REPLICATION_HOST} port=${REPLICATION_PORT} user=${REPLICATION_USER} password=${REPLICATION_PASS} sslmode=${PSQL_SSLMODE}'
|
||||||
|
trigger_file = '/tmp/postgresql.trigger'
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
# check if we need to perform data migration
|
||||||
|
PG_OLD_VERSION=$(find ${PG_HOME}/[0-9].[0-9]/main -maxdepth 1 -name PG_VERSION 2>/dev/null | sort -r | head -n1 | cut -d'/' -f5)
|
||||||
|
|
||||||
|
if [[ $DB_LOCALE != C ]]; then
|
||||||
|
echo "Generating required locale \"${DB_LOCALE}\"..."
|
||||||
|
locale-gen ${DB_LOCALE} >/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Initializing database..."
|
||||||
|
sudo -Hu ${PG_USER} ${PG_BINDIR}/initdb --pgdata=${PG_DATADIR} \
|
||||||
|
--username=${PG_USER} --encoding=unicode --locale=${DB_LOCALE} --auth=trust >/dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n ${PG_OLD_VERSION} ]]; then
|
||||||
|
echo "Migrating postgresql ${PG_OLD_VERSION} data..."
|
||||||
|
PG_OLD_CONFDIR="${PG_HOME}/${PG_OLD_VERSION}/main"
|
||||||
|
PG_OLD_BINDIR="/usr/lib/postgresql/${PG_OLD_VERSION}/bin"
|
||||||
|
PG_OLD_DATADIR="${PG_HOME}/${PG_OLD_VERSION}/main"
|
||||||
|
|
||||||
|
# backup ${PG_OLD_DATADIR} to avoid data loss
|
||||||
|
PG_BKP_SUFFIX=$(date +%Y%m%d%H%M%S)
|
||||||
|
echo "Backing up ${PG_OLD_DATADIR} to ${PG_OLD_DATADIR}.${PG_BKP_SUFFIX}..."
|
||||||
|
cp -a ${PG_OLD_DATADIR} ${PG_OLD_DATADIR}.${PG_BKP_SUFFIX}
|
||||||
|
|
||||||
|
echo "Installing postgresql-${PG_OLD_VERSION}..."
|
||||||
|
apt-get update
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install postgresql-${PG_OLD_VERSION} postgresql-client-${PG_OLD_VERSION}
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# migrate ${PG_OLD_VERSION} data
|
||||||
|
echo "Migration in progress. This could take a while, please be patient..."
|
||||||
|
sudo -Hu ${PG_USER} ${PG_BINDIR}/pg_upgrade \
|
||||||
|
-b ${PG_OLD_BINDIR} -B ${PG_BINDIR} \
|
||||||
|
-d ${PG_OLD_DATADIR} -D ${PG_DATADIR} \
|
||||||
|
-o "-c config_file=${PG_OLD_CONFDIR}/postgresql.conf --hba_file=${PG_OLD_CONFDIR}/pg_hba.conf --ident_file=${PG_OLD_CONFDIR}/pg_ident.conf" \
|
||||||
|
-O "-c config_file=${PG_CONFDIR}/postgresql.conf --hba_file=${PG_CONFDIR}/pg_hba.conf --ident_file=${PG_CONFDIR}/pg_ident.conf" >/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
# fix ownership of ${PG_CONFDIR} (may be necessary if USERMAP_* was set)
|
# fix ownership of ${PG_CONFDIR} (may be necessary if USERMAP_* was set)
|
||||||
chown -R ${PG_USER}:${PG_USER} ${PG_CONFDIR}
|
chown -R ${PG_USER}:${PG_USER} ${PG_CONFDIR}
|
||||||
|
|
||||||
@@ -116,73 +183,6 @@ EOF
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd ${PG_HOME}
|
|
||||||
|
|
||||||
# initialize PostgreSQL data directory
|
|
||||||
if [[ ! -d ${PG_DATADIR} ]]; then
|
|
||||||
if [[ ${PSQL_MODE} == slave || ${PSQL_MODE} == snapshot ]]; then
|
|
||||||
echo "Replicating database..."
|
|
||||||
if [[ ${PSQL_MODE} == snapshot ]]; then
|
|
||||||
sudo -Hu ${PG_USER} \
|
|
||||||
PGPASSWORD=$REPLICATION_PASS ${PG_BINDIR}/pg_basebackup -D ${PG_DATADIR} \
|
|
||||||
-h ${REPLICATION_HOST} -p ${REPLICATION_PORT} -U ${REPLICATION_USER} -w -x -v -P
|
|
||||||
elif [[ ${PSQL_MODE} == slave ]]; then
|
|
||||||
# Setup streaming replication.
|
|
||||||
sudo -Hu ${PG_USER} \
|
|
||||||
PGPASSWORD=$REPLICATION_PASS ${PG_BINDIR}/pg_basebackup -D ${PG_DATADIR} \
|
|
||||||
-h ${REPLICATION_HOST} -p ${REPLICATION_PORT} -U ${REPLICATION_USER} -X stream -w -v -P
|
|
||||||
echo "Setting up hot standby configuration..."
|
|
||||||
cat >> ${PG_CONFDIR}/postgresql.conf <<EOF
|
|
||||||
hot_standby = on
|
|
||||||
EOF
|
|
||||||
sudo -Hu ${PG_USER} touch ${PG_DATADIR}/recovery.conf
|
|
||||||
cat >> ${PG_DATADIR}/recovery.conf <<EOF
|
|
||||||
standby_mode = 'on'
|
|
||||||
primary_conninfo = 'host=${REPLICATION_HOST} port=${REPLICATION_PORT} user=${REPLICATION_USER} password=${REPLICATION_PASS} sslmode=${PSQL_SSLMODE}'
|
|
||||||
trigger_file = '/tmp/postgresql.trigger'
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
else
|
|
||||||
# check if we need to perform data migration
|
|
||||||
PG_OLD_VERSION=$(find ${PG_HOME}/[0-9].[0-9]/main -maxdepth 1 -name PG_VERSION 2>/dev/null | sort -r | head -n1 | cut -d'/' -f5)
|
|
||||||
|
|
||||||
if [[ $DB_LOCALE != C ]]; then
|
|
||||||
echo "Generating required locale \"${DB_LOCALE}\"..."
|
|
||||||
locale-gen ${DB_LOCALE} >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Initializing database..."
|
|
||||||
sudo -Hu ${PG_USER} ${PG_BINDIR}/initdb --pgdata=${PG_DATADIR} \
|
|
||||||
--username=${PG_USER} --encoding=unicode --locale=${DB_LOCALE} --auth=trust >/dev/null
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n ${PG_OLD_VERSION} ]]; then
|
|
||||||
echo "Migrating postgresql ${PG_OLD_VERSION} data..."
|
|
||||||
PG_OLD_CONFDIR="/etc/postgresql/${PG_OLD_VERSION}/main"
|
|
||||||
PG_OLD_BINDIR="/usr/lib/postgresql/${PG_OLD_VERSION}/bin"
|
|
||||||
PG_OLD_DATADIR="${PG_HOME}/${PG_OLD_VERSION}/main"
|
|
||||||
|
|
||||||
# backup ${PG_OLD_DATADIR} to avoid data loss
|
|
||||||
PG_BKP_SUFFIX=$(date +%Y%m%d%H%M%S)
|
|
||||||
echo "Backing up ${PG_OLD_DATADIR} to ${PG_OLD_DATADIR}.${PG_BKP_SUFFIX}..."
|
|
||||||
cp -a ${PG_OLD_DATADIR} ${PG_OLD_DATADIR}.${PG_BKP_SUFFIX}
|
|
||||||
|
|
||||||
echo "Installing postgresql-${PG_OLD_VERSION}..."
|
|
||||||
apt-get update
|
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install postgresql-${PG_OLD_VERSION} postgresql-client-${PG_OLD_VERSION}
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# migrate ${PG_OLD_VERSION} data
|
|
||||||
echo "Migration in progress. This could take a while, please be patient..."
|
|
||||||
sudo -Hu ${PG_USER} ${PG_BINDIR}/pg_upgrade \
|
|
||||||
-b ${PG_OLD_BINDIR} -B ${PG_BINDIR} \
|
|
||||||
-d ${PG_OLD_DATADIR} -D ${PG_DATADIR} \
|
|
||||||
-o "-c config_file=${PG_OLD_CONFDIR}/postgresql.conf" \
|
|
||||||
-O "-c config_file=${PG_CONFDIR}/postgresql.conf" >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Hot standby (slave and snapshot) servers can ignore the following code.
|
# Hot standby (slave and snapshot) servers can ignore the following code.
|
||||||
if [[ ${PSQL_MODE} == standalone || ${PSQL_MODE} == master ]]; then
|
if [[ ${PSQL_MODE} == standalone || ${PSQL_MODE} == master ]]; then
|
||||||
if [[ -n ${REPLICATION_USER} ]]; then
|
if [[ -n ${REPLICATION_USER} ]]; then
|
||||||
@@ -195,8 +195,8 @@ if [[ ${PSQL_MODE} == standalone || ${PSQL_MODE} == master ]]; then
|
|||||||
else
|
else
|
||||||
echo "Creating user \"${REPLICATION_USER}\"..."
|
echo "Creating user \"${REPLICATION_USER}\"..."
|
||||||
echo "CREATE ROLE \"${REPLICATION_USER}\" WITH REPLICATION LOGIN ENCRYPTED PASSWORD '${REPLICATION_PASS}';" |
|
echo "CREATE ROLE \"${REPLICATION_USER}\" WITH REPLICATION LOGIN ENCRYPTED PASSWORD '${REPLICATION_PASS}';" |
|
||||||
sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single \
|
sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single -D ${PG_DATADIR} \
|
||||||
-D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf >/dev/null
|
-c config_file=${PG_CONFDIR}/postgresql.conf --hba_file=${PG_CONFDIR}/pg_hba.conf --ident_file=${PG_CONFDIR}/pg_ident.conf >/dev/null
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -210,8 +210,8 @@ if [[ ${PSQL_MODE} == standalone || ${PSQL_MODE} == master ]]; then
|
|||||||
else
|
else
|
||||||
echo "Creating user \"${DB_USER}\"..."
|
echo "Creating user \"${DB_USER}\"..."
|
||||||
echo "CREATE ROLE \"${DB_USER}\" with LOGIN CREATEDB PASSWORD '${DB_PASS}';" |
|
echo "CREATE ROLE \"${DB_USER}\" with LOGIN CREATEDB PASSWORD '${DB_PASS}';" |
|
||||||
sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single \
|
sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single -D ${PG_DATADIR} \
|
||||||
-D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf >/dev/null
|
-c config_file=${PG_CONFDIR}/postgresql.conf --hba_file=${PG_CONFDIR}/pg_hba.conf --ident_file=${PG_CONFDIR}/pg_ident.conf >/dev/null
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -219,26 +219,26 @@ if [[ ${PSQL_MODE} == standalone || ${PSQL_MODE} == master ]]; then
|
|||||||
for db in $(awk -F',' '{for (i = 1 ; i <= NF ; i++) print $i}' <<< "${DB_NAME}"); do
|
for db in $(awk -F',' '{for (i = 1 ; i <= NF ; i++) print $i}' <<< "${DB_NAME}"); do
|
||||||
echo "Creating database \"${db}\"..."
|
echo "Creating database \"${db}\"..."
|
||||||
echo "CREATE DATABASE \"${db}\";" | \
|
echo "CREATE DATABASE \"${db}\";" | \
|
||||||
sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single \
|
sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single -D ${PG_DATADIR} \
|
||||||
-D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf >/dev/null
|
-c config_file=${PG_CONFDIR}/postgresql.conf --hba_file=${PG_CONFDIR}/pg_hba.conf --ident_file=${PG_CONFDIR}/pg_ident.conf >/dev/null
|
||||||
|
|
||||||
if [[ ${DB_UNACCENT} == true ]]; then
|
if [[ ${DB_UNACCENT} == true ]]; then
|
||||||
echo "Installing unaccent extension..."
|
echo "Installing unaccent extension..."
|
||||||
echo "CREATE EXTENSION IF NOT EXISTS unaccent;" | \
|
echo "CREATE EXTENSION IF NOT EXISTS unaccent;" | \
|
||||||
sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single ${db} \
|
sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single ${db} -D ${PG_DATADIR} \
|
||||||
-D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf >/dev/null
|
-c config_file=${PG_CONFDIR}/postgresql.conf --hba_file=${PG_CONFDIR}/pg_hba.conf --ident_file=${PG_CONFDIR}/pg_ident.conf >/dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n ${DB_USER} ]]; then
|
if [[ -n ${DB_USER} ]]; then
|
||||||
echo "Granting access to database \"${db}\" for user \"${DB_USER}\"..."
|
echo "Granting access to database \"${db}\" for user \"${DB_USER}\"..."
|
||||||
echo "GRANT ALL PRIVILEGES ON DATABASE \"${db}\" to \"${DB_USER}\";" |
|
echo "GRANT ALL PRIVILEGES ON DATABASE \"${db}\" to \"${DB_USER}\";" |
|
||||||
sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single \
|
sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single -D ${PG_DATADIR} \
|
||||||
-D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf >/dev/null
|
-c config_file=${PG_CONFDIR}/postgresql.conf --hba_file=${PG_CONFDIR}/pg_hba.conf --ident_file=${PG_CONFDIR}/pg_ident.conf >/dev/null
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Starting PostgreSQL server..."
|
echo "Starting PostgreSQL server..."
|
||||||
exec start-stop-daemon --start --chuid ${PG_USER}:${PG_USER} --exec ${PG_BINDIR}/postgres -- \
|
exec start-stop-daemon --start --chuid ${PG_USER}:${PG_USER} --exec ${PG_BINDIR}/postgres -- -D ${PG_DATADIR} \
|
||||||
-D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf
|
-c config_file=${PG_CONFDIR}/postgresql.conf --hba_file=${PG_CONFDIR}/pg_hba.conf --ident_file=${PG_CONFDIR}/pg_ident.conf
|
||||||
|
|||||||
Reference in New Issue
Block a user