fix #321: POSTGRES_INITDB_WALDIR handling (#324)

This is mainly to fix #321

Fix POSTGRES_INITDB_WALDIR behaviour as expected for the default setup.

With added several minor improvements:

* Add scenario tests for testing POSTGRES_INITDB_WALDIR possible setup
* Improve README.md
* Fix symlink resolution check
pull/329/head
Rizky Maulana Nugraha 2021-08-19 20:55:32 +07:00 zatwierdzone przez GitHub
rodzic aee92e74d6
commit dd9c11fdcf
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
9 zmienionych plików z 334 dodań i 139 usunięć

Wyświetl plik

@ -14,72 +14,13 @@ on:
# description: Base image variant
# required: true
# default: slim
push:
workflow_dispatch:
pull_request:
branches:
- develop
jobs:
build-image:
runs-on: ubuntu-latest
env:
latest-ref: refs/heads/develop
defaultRepo: kartoza
strategy:
matrix:
postgresMajorVersion:
- 13
postgisMajorVersion:
- 3
postgisMinorRelease:
- 1
include:
- distro: debian
imageVersion: bullseye
imageVariant: slim
steps:
- uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Get build cache
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
# Build inputs are:
# - Dockerfile recipe
# - docker-compose.build.yml
# - build args (.example.env)
# - base_build directory
# - scripts directory
key: buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts', 'scenario_tests/utils/requirements.txt') }}-${{ github.sha }}
restore-keys: |
buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts', 'scenario_tests/utils/requirements.txt') }}-
- name: Build all stages
id: docker_build_base
uses: docker/build-push-action@v2
with:
context: .
file: Dockerfile
push: false
load: true
tags: ${{ secrets.DOCKERHUB_REPO || env.defaultRepo }}/postgis:base-${{ matrix.distro }}-${{ matrix.imageVersion }}-${{ matrix.imageVariant }}
build-args: |
DISTRO=${{ matrix.distro }}
IMAGE_VERSION=${{ matrix.imageVersion }}
IMAGE_VARIANT=${{ matrix.imageVariant }}
LANGS=en_US.UTF-8,id_ID.UTF-8
GENERATE_ALL_LOCALE=0
POSTGRES_MAJOR_VERSION=${{ matrix.postgresMajorVersion }}
POSTGIS_MAJOR_VERSION=${{ matrix.postgisMajorVersion }}
POSTGIS_MINOR_VERSION=${{ matrix.postgresMinorVersion }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,mode=max,dest=/tmp/.buildx-cache
run-scenario-tests:
runs-on: ubuntu-latest
needs: [ build-image ]
strategy:
matrix:
postgresMajorVersion:
@ -104,20 +45,6 @@ jobs:
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Get build cache
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
# Build inputs are:
# - Dockerfile recipe
# - docker-compose.build.yml
# - build args (.example.env)
# - base_build directory
# - scripts directory
key: buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts', 'scenario_tests/utils/requirements.txt') }}-${{ github.sha }}
restore-keys: |
buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts', 'scenario_tests/utils/requirements.txt') }}-
- name: Build image for testing
id: docker_build_testing_image
uses: docker/build-push-action@v2
@ -136,22 +63,25 @@ jobs:
POSTGRES_MAJOR_VERSION=${{ matrix.postgresMajorVersion }}
POSTGIS_MAJOR_VERSION=${{ matrix.postgisMajorVersion }}
POSTGIS_MINOR_VERSION=${{ matrix.postgresMinorVersion }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-from: |
type=gha,scope=test
type=gha,scope=prod
type=gha,scope=base
cache-to: type=gha,scope=test
target: postgis-test
- name: Run scenario test
- name: Run scenario test ${{ matrix.scenario }}
working-directory: scenario_tests/${{ matrix.scenario }}
env:
COMPOSE_INTERACTIVE_NO_CLI: 1
PRINT_TEST_LOGS: 1
run: |
pushd scenario_tests/${{ matrix.scenario }}
./test.sh
popd
bash ./test.sh
push-internal-pr-images:
if: github.event_name == 'pull_request' && github.event.pull_request.base.repo.url == github.event.pull_request.head.repo.url
runs-on: ubuntu-latest
needs: [ build-image ]
needs: [ run-scenario-tests ]
strategy:
matrix:
postgresMajorVersion:
@ -165,37 +95,25 @@ jobs:
imageVersion: bullseye
imageVariant: slim
steps:
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Docker meta
id: docker_meta
uses: crazy-max/ghaction-docker-meta@v1
with:
images: ${{ secrets.DOCKERHUB_REPO}}/postgis
tag-latest: false
- uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Get build cache
uses: actions/cache@v2
- name: Login to DockerHub
uses: docker/login-action@v1
with:
path: /tmp/.buildx-cache
# Build inputs are:
# - Dockerfile recipe
# - docker-compose.build.yml
# - build args (.example.env)
# - base_build directory
# - scripts directory
key: buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts') }}-${{ github.sha }}
restore-keys: |
buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts') }}-
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Docker meta
id: docker_meta
uses: docker/metadata-action@v3
with:
images: ${{ secrets.DOCKERHUB_REPO}}/postgis
tags: |
type=semver,pattern=\d-\d.\d
type=ref,event=branch
type=ref,event=pr
- name: Build image for testing
id: docker_build_testing_image
@ -204,7 +122,8 @@ jobs:
context: .
file: Dockerfile
push: true
tags: ${{ steps.docker_meta.outputs.tags }}-${{ matrix.postgresMajorVersion }}-${{ matrix.postgisMajorVersion }}.${{ matrix.postgisMinorRelease }}
tags: |
${{ steps.docker_meta.outputs.tags }}-${{ matrix.postgresMajorVersion }}-${{ matrix.postgisMajorVersion }}.${{ matrix.postgisMinorRelease }}
build-args: |
DISTRO=${{ matrix.distro }}
IMAGE_VERSION=${{ matrix.imageVersion }}
@ -214,5 +133,9 @@ jobs:
POSTGRES_MAJOR_VERSION=${{ matrix.postgresMajorVersion }}
POSTGIS_MAJOR_VERSION=${{ matrix.postgisMajorVersion }}
POSTGIS_MINOR_VERSION=${{ matrix.postgresMinorVersion }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-from: |
type=gha,scope=test
type=gha,scope=prod
type=gha,scope=base
cache-to: type=gha,scope=test
target: postgis-test

Wyświetl plik

@ -44,19 +44,6 @@ jobs:
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Get build cache
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
# Build inputs are:
# - Dockerfile recipe
# - docker-compose.build.yml
# - build args (.example.env)
# - base_build directory
# - scripts directory
key: buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts', 'scenario_tests/utils/requirements.txt') }}-${{ github.sha }}
restore-keys: |
buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts', 'scenario_tests/utils/requirements.txt') }}-
- name: Login to DockerHub
uses: docker/login-action@v1
@ -82,8 +69,11 @@ jobs:
POSTGRES_MAJOR_VERSION=${{ matrix.postgresMajorVersion }}
POSTGIS_MAJOR_VERSION=${{ matrix.postgisMajorVersion }}
POSTGIS_MINOR_VERSION=${{ matrix.postgresMinorVersion }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
cache-from: |
type=gha,scope=test
type=gha,scope=prod
type=gha,scope=base
cache-to: type=gha,scope=base
target: postgis-base
- name: Build prod image
@ -105,6 +95,9 @@ jobs:
POSTGRES_MAJOR_VERSION=${{ matrix.postgresMajorVersion }}
POSTGIS_MAJOR_VERSION=${{ matrix.postgisMajorVersion }}
POSTGIS_MINOR_VERSION=${{ matrix.postgresMinorVersion }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
cache-from: |
type=gha,scope=test
type=gha,scope=prod
type=gha,scope=base
cache-to: type=gha,scope=prod
target: postgis-prod

Wyświetl plik

@ -1,4 +1,5 @@
[![Build Status](https://travis-ci.org/kartoza/docker-postgis.svg?branch=develop)](https://travis-ci.org/kartoza/docker-postgis)
[![Scenario Tests](https://github.com/kartoza/docker-postgis/actions/workflows/build-latest.yaml/badge.svg?branch=develop&event=push)](https://github.com/kartoza/docker-postgis/actions/workflows/build-latest.yaml)
[![deploy-image](https://github.com/kartoza/docker-postgis/actions/workflows/deploy-image.yaml/badge.svg)](https://github.com/kartoza/docker-postgis/actions/workflows/deploy-image.yaml)
# docker-postgis
@ -143,7 +144,7 @@ You need to specify different empty directory, like this
The containers will use above parameters to initialize a new db cluster in the
specified directory. If the directory is not empty, then initialization parameter will be ignored.
These are some initialization parameters that will only get used to initialize a new cluster.
These are some initialization parameters that will only be used to initialize a new cluster.
If the container uses an existing cluster, it is ignored (for example, when the container restarts).
* `DEFAULT_ENCODING`: cluster encoding
@ -152,6 +153,7 @@ If the container uses an existing cluster, it is ignored (for example, when the
* `WAL_SEGSIZE`: WAL segsize option
* `PASSWORD_AUTHENTICATION` : PASSWORD AUTHENTICATION
* `INITDB_EXTRA_ARGS`: extra parameter that will be passed down to `initdb` command
* `POSTGRES_INITDB_WALDIR`: parameter to tell postgres about the initial waldir location. Note that you must always mount persistent volume to this location. Postgres will expect that the directory will always be available, even though it doesn't need the environment variable anymore. If you didn't persist this location, postgres will not be able to find the `pg_wal` directory and consider the instance to be broken.
In addition to that, we have another parameter: `RECREATE_DATADIR` that can be used to force database reinitializations.
If this parameter is specified as `TRUE` it will act as explicit consent to delete `DATADIR` and create

Wyświetl plik

@ -2,7 +2,10 @@ version: '2.1'
volumes:
default-pg-data-dir:
new-pg-data-dir:
new-pg-data-dir-2:
new-pg-data-dir-3:
recreate-pg-data-dir:
init-waldir:
services:
pg-default:
image: 'kartoza/postgis:${TAG:-manual-build}'
@ -58,3 +61,83 @@ services:
timeout: 30s
retries: 3
test: "pg_isready"
pg-custom-waldir-wrong:
image: 'kartoza/postgis:${TAG:-manual-build}'
volumes:
# Mount to a locations where there are initial data
- new-pg-data-dir-2:/opt/mypostgis/data
# Specify different waldir location
- init-waldir:/opt/mypostgis/data/waldir
- ./tests:/tests
- ../utils:/lib/utils
environment:
TEST_CLASS: TestCustomWALdir
DATADIR: /opt/mypostgis/data
POSTGRES_INITDB_WALDIR: /opt/mypostgis/data/waldir
POSTGRES_PASS: 'docker'
healthcheck:
interval: 60s
timeout: 30s
retries: 3
test: "pg_isready"
pg-custom-waldir-correct:
image: 'kartoza/postgis:${TAG:-manual-build}'
volumes:
# Mount to new locations where there are no initial data
- new-pg-data-dir-3:/opt/mypostgis/data
# Specify different waldir location
- init-waldir:/opt/mypostgis/waldir
- ./tests:/tests
- ../utils:/lib/utils
environment:
TEST_CLASS: TestCustomWALdir
DATADIR: /opt/mypostgis/data
POSTGRES_INITDB_WALDIR: /opt/mypostgis/waldir
POSTGRES_PASS: 'docker'
healthcheck:
interval: 60s
timeout: 30s
retries: 3
test: "pg_isready"
pg-custom-waldir-not-match-1:
image: 'kartoza/postgis:${TAG:-manual-build}'
volumes:
# Mount to a locations where there are initial data
- new-pg-data-dir-3:/opt/mypostgis/data
# Specify different waldir location
- init-waldir:/opt/mypostgis/waldir
- ./tests:/tests
- ../utils:/lib/utils
environment:
TEST_CLASS: TestCustomWALdirNotMatch
DATADIR: /opt/mypostgis/data
POSTGRES_INITDB_WALDIR: /opt/waldir
POSTGRES_PASS: 'docker'
healthcheck:
interval: 60s
timeout: 30s
retries: 3
test: "pg_isready"
pg-custom-waldir-not-match-2:
image: 'kartoza/postgis:${TAG:-manual-build}'
volumes:
# Mount to a locations where there are initial data
- new-pg-data-dir-2:/opt/mypostgis/data
# Specify different waldir location
- init-waldir:/opt/waldir
- ./tests:/tests
- ../utils:/lib/utils
environment:
TEST_CLASS: TestCustomWALdirNotMatch
DATADIR: /opt/mypostgis/data
POSTGRES_INITDB_WALDIR: /opt/waldir
POSTGRES_PASS: 'docker'
healthcheck:
interval: 60s
timeout: 30s
retries: 3
test: "pg_isready"

Wyświetl plik

@ -6,7 +6,7 @@ set -e
source ../test-env.sh
# Run service
docker-compose up -d
docker-compose up -d pg-default pg-new pg-recreate
if [[ -n "${PRINT_TEST_LOGS}" ]]; then
docker-compose logs -f &
@ -28,4 +28,7 @@ for service in "${services[@]}"; do
done
# special meta test to check the setup
bash ./test_custom_waldir.sh
docker-compose down -v

Wyświetl plik

@ -0,0 +1,110 @@
#!/usr/bin/env bash
# exit immediately if test fails
set -e
source ../test-env.sh
# This test is special
# It is used to check the meta level of the setup.
# Print logs
if [[ -n "${PRINT_TEST_LOGS}" ]]; then
docker-compose logs -f &
fi
# Recreate containers with the same setup as pg-new and pg-default
# Try to make sure that container recreation is successful
echo "### Checking Container Recreation"
docker-compose down
docker-compose up -d pg-default pg-new pg-recreate
sleep 60
services=("pg-default" "pg-new" "pg-recreate")
for service in "${services[@]}"; do
# Execute tests
until docker-compose exec -T $service pg_isready; do
sleep 5
echo "Wait service to be ready"
done;
echo "Execute test for $service"
docker-compose exec -T $service /bin/bash /tests/test.sh
done
# Check the wrong setup must have warned that nested custom pg_wal location
# is prevented
echo "### Checking Error Message on nested pg_wal location"
service="pg-custom-waldir-wrong"
docker-compose up -d pg-custom-waldir-wrong
sleep 60
# Loop until we found error message
while true; do
if [[ -n "$(docker-compose logs $service | grep 'Error')" && \
-n "$(docker-compose logs $service | grep 'POSTGRES_INITDB_WALDIR should not be set to be inside DATADIR or PGDATA.')" ]]; then
break
fi
sleep 5
done;
docker-compose down
# Check that the correct custom initdb waldir works, twice after container restart.
echo "### Checking custom POSTGRES_INITDB_WALDIR should work"
service="pg-custom-waldir-correct"
for ((i=1;i<=2;i++)); do
echo "attempt $i"
docker-compose up -d $service
sleep 60
until docker-compose exec -T $service pg_isready; do
sleep 5
echo "Wait service to be ready"
done;
echo "Execute test for $service"
docker-compose exec -T $service /bin/bash /tests/test.sh
docker-compose down
done
# Check that if the variable POSTGRES_INITBD_WALDIR doesn't match with pg_wal symlink,
# then give warning, but proceeds if the the mount is still correct
echo "### Checking raise warning if custom POSTGRES_INITDB_WALDIR does not match"
service="pg-custom-waldir-not-match-1"
docker-compose up -d $service
sleep 60
# Loop until we found warning message
while true; do
if [[ -n "$(docker-compose logs $service | grep 'Warning')" && \
-n "$(docker-compose logs $service | grep 'POSTGRES_INITDB_WALDIR is not the same as what pg_wal is pointing to.')" ]]; then
break
fi
sleep 5
done;
until docker-compose exec -T $service pg_isready; do
sleep 5
echo "Wait service to be ready"
done;
echo "Execute test for $service"
docker-compose exec -T $service /bin/bash /tests/test.sh
docker-compose down
# Check that if the pg_wal is empty, then something is wrong and we should exit
echo "### Checking Error and Exit if pg_wal is empty"
service="pg-custom-waldir-not-match-2"
docker-compose up -d $service
sleep 60
# Loop until we found warning message
warning_text="Can't proceed because \"/opt/mypostgis/data/pg_wal\" directory is empty."
while true; do
if [[ -n "$(docker-compose logs $service | grep 'Error')" && \
-n "$(docker-compose logs $service | grep "$warning_text")" ]]; then
break
fi
sleep 5
done;
docker-compose down -v

Wyświetl plik

@ -1,6 +1,7 @@
import unittest
import os
from utils.utils import DBConnection
from pathlib import Path
class TestCollationBase(unittest.TestCase):
@ -78,3 +79,35 @@ class TestRecreate(TestCollationBase):
self.assertEqual(dbcollate, os.environ.get('DEFAULT_COLLATION'))
self.assertEqual(dbctype, os.environ.get('DEFAULT_CTYPE'))
class TestCustomWALdir(TestCollationBase):
def test_check_pg_wal_symlink(self):
self.db.conn.autocommit = True
postgres_initdb_waldir = os.environ.get('POSTGRES_INITDB_WALDIR')
with self.db.cursor() as c:
datadir_location = self.fetch_datadir_location(c)
pg_wal_symlink = os.path.join(datadir_location, 'pg_wal')
# In this correct setup, pg_wal symlink must resolve to the
# correct POSTGRES_INITDB_WALDIR location
self.assertTrue(
Path(pg_wal_symlink).resolve().match(postgres_initdb_waldir))
class TestCustomWALdirNotMatch(TestCollationBase):
def test_check_pg_wal_symlink(self):
self.db.conn.autocommit = True
postgres_initdb_waldir = os.environ.get('POSTGRES_INITDB_WALDIR')
with self.db.cursor() as c:
datadir_location = self.fetch_datadir_location(c)
pg_wal_symlink = os.path.join(datadir_location, 'pg_wal')
# In this wrong setup, pg_wal symlink and POSTGRES_INITDB_WALDIR
# must resolve to a different path to raise the warning
self.assertFalse(
Path(pg_wal_symlink).resolve().match(postgres_initdb_waldir))
# It has different path, but if this unittests runs, that means
# postgres was able to start and the pg_wal symlink contains correct
# data
self.assertTrue(os.listdir(pg_wal_symlink))

Wyświetl plik

@ -3,7 +3,9 @@ POSTGRES_MAJOR_VERSION=$(cat /tmp/pg_version.txt)
POSTGIS_MAJOR=$(cat /tmp/pg_major_version.txt)
POSTGIS_MINOR_RELEASE=$(cat /tmp/pg_minor_version.txt)
DEFAULT_DATADIR="/var/lib/postgresql/${POSTGRES_MAJOR_VERSION}/main"
DEFAULT_INITDB_WALDIR="/var/lib/postgresql/${POSTGRES_MAJOR_VERSION}/pg_waldir"
# Commented for documentation. You can specify the location of
# pg_wal directory/volume using the following environment variable:
# POSTGRES_INITDB_WALDIR (default value is unset)
ROOT_CONF="/etc/postgresql/${POSTGRES_MAJOR_VERSION}/main"
PG_ENV="$ROOT_CONF/environment"
CONF="$ROOT_CONF/postgresql.conf"
@ -71,10 +73,6 @@ fi
}
if [ -z "${POSTGRES_INITDB_WALDIR}" ]; then
POSTGRES_INITDB_WALDIR=${DEFAULT_INITDB_WALDIR}
fi
# Make sure we have a user set up
if [ -z "${POSTGRES_USER}" ]; then
POSTGRES_USER=docker

Wyświetl plik

@ -3,26 +3,76 @@
source /scripts/env-data.sh
POSTGRES_PASS=$(cat /tmp/PGPASSWORD.txt)
INITDB_WALDIR_FLAG=""
# Check POSTGRES_INITDB_WALDIR value
if [[ -n "${POSTGRES_INITDB_WALDIR}" ]]; then
# If POSTGRES_INITDB_WALDIR is defined, make sure that it is not inside
# the ${DATADIR} directory, to avoid deletions
case "${POSTGRES_INITDB_WALDIR}" in
${DATADIR}/*)
# In this case, we have to fail early
echo "POSTGRES_INITDB_WALDIR should not be set to be inside DATADIR or PGDATA"
cat << EOF 1>&2
Error!
POSTGRES_INITDB_WALDIR should not be set to be inside DATADIR or PGDATA.
POSTGRES_INITDB_WALDIR: ${POSTGRES_INITDB_WALDIR}
DATADIR or PGDATA: ${DATADIR}
EOF
exit 1
;;
*)
# For other case, make sure the directory is created with proper permissions
create_dir "${POSTGRES_INITDB_WALDIR}"
chown -R postgres:postgres ${POSTGRES_INITDB_WALDIR}
;;
esac
# Set the --waldir flag for postgres initialization
INITDB_WALDIR_FLAG="--waldir ${POSTGRES_INITDB_WALDIR}"
fi
# test if DATADIR has content
# Do initialization if DATADIR is empty, or RECREATE_DATADIR is true
if [[ -z "$(ls -A ${DATADIR} 2> /dev/null)" || "${RECREATE_DATADIR}" == 'TRUE' ]]; then
# Do initialization if DATADIR directory is empty, or RECREATE_DATADIR is true
if [[ -z "$(ls -A ${DATADIR} 2> /dev/null)" || "${RECREATE_DATADIR}" =~ [Tt][Rr][Uu][Ee] ]]; then
# Only attempt reinitializations if ${RECREATE_DATADIR} is true
# No Replicate From settings. Assume that this is a master database.
# Initialise db
echo "Initializing Postgres Database at ${DATADIR}"
create_dir ${POSTGRES_INITDB_WALDIR}
create_dir ${DATADIR}
create_dir "${DATADIR}"
rm -rf ${DATADIR}/*
chown -R postgres:postgres ${DATADIR} ${POSTGRES_INITDB_WALDIR}
chown -R postgres:postgres "${DATADIR}"
echo "Initializing with command:"
command="$INITDB -U postgres --pwfile=<(echo "$POSTGRES_PASS") -E ${DEFAULT_ENCODING} --lc-collate=${DEFAULT_COLLATION} --lc-ctype=${DEFAULT_CTYPE} --wal-segsize=${WAL_SEGSIZE} --auth=${PASSWORD_AUTHENTICATION} -D ${DATADIR} --waldir=${POSTGRES_INITDB_WALDIR} ${INITDB_EXTRA_ARGS}"
command="$INITDB -U postgres --pwfile=<(echo "$POSTGRES_PASS") -E ${DEFAULT_ENCODING} --lc-collate=${DEFAULT_COLLATION} --lc-ctype=${DEFAULT_CTYPE} --wal-segsize=${WAL_SEGSIZE} --auth=${PASSWORD_AUTHENTICATION} -D ${DATADIR} ${INITDB_WALDIR_FLAG} ${INITDB_EXTRA_ARGS}"
echo "$command"
su - postgres -c "$command"
else
# If using existing datadir:
# Check if pg_wal symlink point to the correct directory described by POSTGRES_INITDB_WALDIR.
# Give warning if the value is not the same
if [[ -n "${POSTGRES_INITDB_WALDIR}" && \
"$(realpath ${POSTGRES_INITDB_WALDIR})" != "$(realpath "$(readlink ${DATADIR}/pg_wal)")" ]]; then
cat << EOF 1>&2
Warning!
POSTGRES_INITDB_WALDIR is not the same as what pg_wal is pointing to.
POSTGRES_INITDB_WALDIR: ${POSTGRES_INITDB_WALDIR}
pg_wal: $(readlink ${DATADIR}/pg_wal)
EOF
fi
# Check if the pg_wal is empty.
# Exit the process if pg_wal is somehow empty
if [[ -z "$(ls -A ${DATADIR}/pg_wal 2> /dev/null)" ]]; then
cat << EOF 1>&2
Error!
Can't proceed because "${DATADIR}/pg_wal" directory is empty.
EOF
exit 1
fi
fi;
# Set proper permissions
# needs to be done as root:
create_dir ${WAL_ARCHIVE}
create_dir "${WAL_ARCHIVE}"
chown -R postgres:postgres ${DATADIR} ${WAL_ARCHIVE}
chmod -R 750 ${DATADIR} ${WAL_ARCHIVE}