From 693995dd2b82bfe3fe2860a616cf53947d1af7a3 Mon Sep 17 00:00:00 2001 From: Sameer Naik Date: Sun, 15 Nov 2015 12:59:20 +0530 Subject: [PATCH] set `PG_CONFDIR` to `${PG_HOME}/${PG_VERSION}/main` Database initialization and migration tasks need to be done before performing any configuration bits --- Dockerfile | 4 +- entrypoint.sh | 158 +++++++++++++++++++++++++------------------------- 2 files changed, 81 insertions(+), 81 deletions(-) diff --git a/Dockerfile b/Dockerfile index c0d7eb8..6fa9682 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,8 +7,8 @@ ENV PG_VERSION=9.4 \ PG_RUNDIR=/run/postgresql \ PG_LOGDIR=/var/log/postgresql -ENV PG_CONFDIR="/etc/postgresql/${PG_VERSION}/main" \ - PG_BINDIR="/usr/lib/postgresql/${PG_VERSION}/bin" \ +ENV PG_BINDIR="/usr/lib/postgresql/${PG_VERSION}/bin" \ + PG_CONFDIR="${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 - \ diff --git a/entrypoint.sh b/entrypoint.sh index 0d50d4d..6e6d42b 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -61,6 +61,73 @@ create_data_dir create_log_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 <> ${PG_DATADIR}/recovery.conf </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) chown -R ${PG_USER}:${PG_USER} ${PG_CONFDIR} @@ -116,73 +183,6 @@ EOF 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 <> ${PG_DATADIR}/recovery.conf </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. if [[ ${PSQL_MODE} == standalone || ${PSQL_MODE} == master ]]; then if [[ -n ${REPLICATION_USER} ]]; then @@ -195,8 +195,8 @@ if [[ ${PSQL_MODE} == standalone || ${PSQL_MODE} == master ]]; then else echo "Creating user \"${REPLICATION_USER}\"..." echo "CREATE ROLE \"${REPLICATION_USER}\" WITH REPLICATION LOGIN ENCRYPTED PASSWORD '${REPLICATION_PASS}';" | - sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single \ - -D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf >/dev/null + sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single -D ${PG_DATADIR} \ + -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 @@ -210,8 +210,8 @@ if [[ ${PSQL_MODE} == standalone || ${PSQL_MODE} == master ]]; then else echo "Creating user \"${DB_USER}\"..." echo "CREATE ROLE \"${DB_USER}\" with LOGIN CREATEDB PASSWORD '${DB_PASS}';" | - sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single \ - -D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf >/dev/null + sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single -D ${PG_DATADIR} \ + -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 @@ -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 echo "Creating database \"${db}\"..." echo "CREATE DATABASE \"${db}\";" | \ - sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single \ - -D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf >/dev/null + sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single -D ${PG_DATADIR} \ + -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 echo "Installing unaccent extension..." echo "CREATE EXTENSION IF NOT EXISTS unaccent;" | \ - sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single ${db} \ - -D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf >/dev/null + sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single ${db} -D ${PG_DATADIR} \ + -c config_file=${PG_CONFDIR}/postgresql.conf --hba_file=${PG_CONFDIR}/pg_hba.conf --ident_file=${PG_CONFDIR}/pg_ident.conf >/dev/null fi if [[ -n ${DB_USER} ]]; then echo "Granting access to database \"${db}\" for user \"${DB_USER}\"..." echo "GRANT ALL PRIVILEGES ON DATABASE \"${db}\" to \"${DB_USER}\";" | - sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single \ - -D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf >/dev/null + sudo -Hu ${PG_USER} ${PG_BINDIR}/postgres --single -D ${PG_DATADIR} \ + -c config_file=${PG_CONFDIR}/postgresql.conf --hba_file=${PG_CONFDIR}/pg_hba.conf --ident_file=${PG_CONFDIR}/pg_ident.conf >/dev/null fi done fi fi echo "Starting PostgreSQL server..." -exec start-stop-daemon --start --chuid ${PG_USER}:${PG_USER} --exec ${PG_BINDIR}/postgres -- \ - -D ${PG_DATADIR} -c config_file=${PG_CONFDIR}/postgresql.conf +exec start-stop-daemon --start --chuid ${PG_USER}:${PG_USER} --exec ${PG_BINDIR}/postgres -- -D ${PG_DATADIR} \ + -c config_file=${PG_CONFDIR}/postgresql.conf --hba_file=${PG_CONFDIR}/pg_hba.conf --ident_file=${PG_CONFDIR}/pg_ident.conf