-
Notifications
You must be signed in to change notification settings - Fork 2.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update postgres #15911
Merged
Merged
Update postgres #15911
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Changes: - docker-library/postgres@31aed10: Merge pull request docker-library/postgres#1150 from infosiftr/docker-ensure-initdb
Diff for 8702758:diff --git a/_bashbrew-cat b/_bashbrew-cat
index 806215e..a7208d3 100644
--- a/_bashbrew-cat
+++ b/_bashbrew-cat
@@ -3,100 +3,100 @@ GitRepo: https://github.com/docker-library/postgres.git
Tags: 12.17, 12, 12.17-bookworm, 12-bookworm
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x
-GitCommit: a42b68455866552c2ad2fc9a8e18d46b50712139
+GitCommit: c86568af4a6861cb30b8f1b736b0868a3129bdd6
Directory: 12/bookworm
Tags: 12.17-alpine3.18, 12-alpine3.18
Architectures: amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x
-GitCommit: 1d4651c6c9ee4caf314a62a41111e7c65710f77e
+GitCommit: 31aed10dbe490c13e5ca889897ee01ef3e1b91e2
Directory: 12/alpine3.18
Tags: 12.17-alpine3.19, 12-alpine3.19, 12.17-alpine, 12-alpine
Architectures: amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x
-GitCommit: 1d4651c6c9ee4caf314a62a41111e7c65710f77e
+GitCommit: 31aed10dbe490c13e5ca889897ee01ef3e1b91e2
Directory: 12/alpine3.19
Tags: 12.17-bullseye, 12-bullseye
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x
-GitCommit: a42b68455866552c2ad2fc9a8e18d46b50712139
+GitCommit: c86568af4a6861cb30b8f1b736b0868a3129bdd6
Directory: 12/bullseye
Tags: 13.13, 13, 13.13-bookworm, 13-bookworm
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x
-GitCommit: a42b68455866552c2ad2fc9a8e18d46b50712139
+GitCommit: c86568af4a6861cb30b8f1b736b0868a3129bdd6
Directory: 13/bookworm
Tags: 13.13-alpine3.18, 13-alpine3.18
Architectures: amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x
-GitCommit: 1d4651c6c9ee4caf314a62a41111e7c65710f77e
+GitCommit: 31aed10dbe490c13e5ca889897ee01ef3e1b91e2
Directory: 13/alpine3.18
Tags: 13.13-alpine3.19, 13-alpine3.19, 13.13-alpine, 13-alpine
Architectures: amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x
-GitCommit: 1d4651c6c9ee4caf314a62a41111e7c65710f77e
+GitCommit: 31aed10dbe490c13e5ca889897ee01ef3e1b91e2
Directory: 13/alpine3.19
Tags: 13.13-bullseye, 13-bullseye
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x
-GitCommit: a42b68455866552c2ad2fc9a8e18d46b50712139
+GitCommit: c86568af4a6861cb30b8f1b736b0868a3129bdd6
Directory: 13/bullseye
Tags: 14.10, 14, 14.10-bookworm, 14-bookworm
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x
-GitCommit: a42b68455866552c2ad2fc9a8e18d46b50712139
+GitCommit: c86568af4a6861cb30b8f1b736b0868a3129bdd6
Directory: 14/bookworm
Tags: 14.10-alpine3.18, 14-alpine3.18
Architectures: amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x
-GitCommit: 1d4651c6c9ee4caf314a62a41111e7c65710f77e
+GitCommit: 31aed10dbe490c13e5ca889897ee01ef3e1b91e2
Directory: 14/alpine3.18
Tags: 14.10-alpine3.19, 14-alpine3.19, 14.10-alpine, 14-alpine
Architectures: amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x
-GitCommit: 1d4651c6c9ee4caf314a62a41111e7c65710f77e
+GitCommit: 31aed10dbe490c13e5ca889897ee01ef3e1b91e2
Directory: 14/alpine3.19
Tags: 14.10-bullseye, 14-bullseye
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x
-GitCommit: a42b68455866552c2ad2fc9a8e18d46b50712139
+GitCommit: c86568af4a6861cb30b8f1b736b0868a3129bdd6
Directory: 14/bullseye
Tags: 15.5, 15, 15.5-bookworm, 15-bookworm
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x
-GitCommit: a42b68455866552c2ad2fc9a8e18d46b50712139
+GitCommit: c86568af4a6861cb30b8f1b736b0868a3129bdd6
Directory: 15/bookworm
Tags: 15.5-alpine3.18, 15-alpine3.18
Architectures: amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x
-GitCommit: 1d4651c6c9ee4caf314a62a41111e7c65710f77e
+GitCommit: 31aed10dbe490c13e5ca889897ee01ef3e1b91e2
Directory: 15/alpine3.18
Tags: 15.5-alpine3.19, 15-alpine3.19, 15.5-alpine, 15-alpine
Architectures: amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x
-GitCommit: 1d4651c6c9ee4caf314a62a41111e7c65710f77e
+GitCommit: 31aed10dbe490c13e5ca889897ee01ef3e1b91e2
Directory: 15/alpine3.19
Tags: 15.5-bullseye, 15-bullseye
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x
-GitCommit: a42b68455866552c2ad2fc9a8e18d46b50712139
+GitCommit: c86568af4a6861cb30b8f1b736b0868a3129bdd6
Directory: 15/bullseye
Tags: 16.1, 16, latest, 16.1-bookworm, 16-bookworm, bookworm
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x
-GitCommit: a42b68455866552c2ad2fc9a8e18d46b50712139
+GitCommit: c86568af4a6861cb30b8f1b736b0868a3129bdd6
Directory: 16/bookworm
Tags: 16.1-alpine3.18, 16-alpine3.18, alpine3.18
Architectures: amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x
-GitCommit: 1d4651c6c9ee4caf314a62a41111e7c65710f77e
+GitCommit: 31aed10dbe490c13e5ca889897ee01ef3e1b91e2
Directory: 16/alpine3.18
Tags: 16.1-alpine3.19, 16-alpine3.19, alpine3.19, 16.1-alpine, 16-alpine, alpine
Architectures: amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x
-GitCommit: 1d4651c6c9ee4caf314a62a41111e7c65710f77e
+GitCommit: 31aed10dbe490c13e5ca889897ee01ef3e1b91e2
Directory: 16/alpine3.19
Tags: 16.1-bullseye, 16-bullseye, bullseye
Architectures: amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x
-GitCommit: a42b68455866552c2ad2fc9a8e18d46b50712139
+GitCommit: c86568af4a6861cb30b8f1b736b0868a3129bdd6
Directory: 16/bullseye
diff --git a/postgres_12-alpine/Dockerfile b/postgres_12-alpine/Dockerfile
index d3c4866..44927f2 100644
--- a/postgres_12-alpine/Dockerfile
+++ b/postgres_12-alpine/Dockerfile
@@ -167,7 +167,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_12-alpine/docker-ensure-initdb.sh b/postgres_12-alpine/docker-ensure-initdb.sh
new file mode 100755
index 0000000..2a97586
--- /dev/null
+++ b/postgres_12-alpine/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec su-exec postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_12-alpine/docker-entrypoint.sh b/postgres_12-alpine/docker-entrypoint.sh
index a383a36..151d75e 100755
--- a/postgres_12-alpine/docker-entrypoint.sh
+++ b/postgres_12-alpine/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_12-alpine3.18/Dockerfile b/postgres_12-alpine3.18/Dockerfile
index 13907f6..2c83e89 100644
--- a/postgres_12-alpine3.18/Dockerfile
+++ b/postgres_12-alpine3.18/Dockerfile
@@ -167,7 +167,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_12-alpine3.18/docker-ensure-initdb.sh b/postgres_12-alpine3.18/docker-ensure-initdb.sh
new file mode 100755
index 0000000..2a97586
--- /dev/null
+++ b/postgres_12-alpine3.18/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec su-exec postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_12-alpine3.18/docker-entrypoint.sh b/postgres_12-alpine3.18/docker-entrypoint.sh
index a383a36..151d75e 100755
--- a/postgres_12-alpine3.18/docker-entrypoint.sh
+++ b/postgres_12-alpine3.18/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_12-bookworm/Dockerfile b/postgres_12-bookworm/Dockerfile
index 165a966..647dc8d 100644
--- a/postgres_12-bookworm/Dockerfile
+++ b/postgres_12-bookworm/Dockerfile
@@ -184,7 +184,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_12-bookworm/docker-ensure-initdb.sh b/postgres_12-bookworm/docker-ensure-initdb.sh
new file mode 100755
index 0000000..ae1f6b6
--- /dev/null
+++ b/postgres_12-bookworm/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec gosu postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_12-bookworm/docker-entrypoint.sh b/postgres_12-bookworm/docker-entrypoint.sh
index 0ae0ecf..6d197bc 100755
--- a/postgres_12-bookworm/docker-entrypoint.sh
+++ b/postgres_12-bookworm/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_12-bullseye/Dockerfile b/postgres_12-bullseye/Dockerfile
index 6a6dd9e..8238633 100644
--- a/postgres_12-bullseye/Dockerfile
+++ b/postgres_12-bullseye/Dockerfile
@@ -184,7 +184,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_12-bullseye/docker-ensure-initdb.sh b/postgres_12-bullseye/docker-ensure-initdb.sh
new file mode 100755
index 0000000..ae1f6b6
--- /dev/null
+++ b/postgres_12-bullseye/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec gosu postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_12-bullseye/docker-entrypoint.sh b/postgres_12-bullseye/docker-entrypoint.sh
index 0ae0ecf..6d197bc 100755
--- a/postgres_12-bullseye/docker-entrypoint.sh
+++ b/postgres_12-bullseye/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_13-alpine/Dockerfile b/postgres_13-alpine/Dockerfile
index b91d2ed..1784e8e 100644
--- a/postgres_13-alpine/Dockerfile
+++ b/postgres_13-alpine/Dockerfile
@@ -167,7 +167,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_13-alpine/docker-ensure-initdb.sh b/postgres_13-alpine/docker-ensure-initdb.sh
new file mode 100755
index 0000000..2a97586
--- /dev/null
+++ b/postgres_13-alpine/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec su-exec postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_13-alpine/docker-entrypoint.sh b/postgres_13-alpine/docker-entrypoint.sh
index a383a36..151d75e 100755
--- a/postgres_13-alpine/docker-entrypoint.sh
+++ b/postgres_13-alpine/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_13-alpine3.18/Dockerfile b/postgres_13-alpine3.18/Dockerfile
index ae04764..7926633 100644
--- a/postgres_13-alpine3.18/Dockerfile
+++ b/postgres_13-alpine3.18/Dockerfile
@@ -167,7 +167,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_13-alpine3.18/docker-ensure-initdb.sh b/postgres_13-alpine3.18/docker-ensure-initdb.sh
new file mode 100755
index 0000000..2a97586
--- /dev/null
+++ b/postgres_13-alpine3.18/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec su-exec postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_13-alpine3.18/docker-entrypoint.sh b/postgres_13-alpine3.18/docker-entrypoint.sh
index a383a36..151d75e 100755
--- a/postgres_13-alpine3.18/docker-entrypoint.sh
+++ b/postgres_13-alpine3.18/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_13-bookworm/Dockerfile b/postgres_13-bookworm/Dockerfile
index d97ed42..1086785 100644
--- a/postgres_13-bookworm/Dockerfile
+++ b/postgres_13-bookworm/Dockerfile
@@ -186,7 +186,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_13-bookworm/docker-ensure-initdb.sh b/postgres_13-bookworm/docker-ensure-initdb.sh
new file mode 100755
index 0000000..ae1f6b6
--- /dev/null
+++ b/postgres_13-bookworm/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec gosu postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_13-bookworm/docker-entrypoint.sh b/postgres_13-bookworm/docker-entrypoint.sh
index 0ae0ecf..6d197bc 100755
--- a/postgres_13-bookworm/docker-entrypoint.sh
+++ b/postgres_13-bookworm/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_13-bullseye/Dockerfile b/postgres_13-bullseye/Dockerfile
index d88766f..0f2b30c 100644
--- a/postgres_13-bullseye/Dockerfile
+++ b/postgres_13-bullseye/Dockerfile
@@ -186,7 +186,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_13-bullseye/docker-ensure-initdb.sh b/postgres_13-bullseye/docker-ensure-initdb.sh
new file mode 100755
index 0000000..ae1f6b6
--- /dev/null
+++ b/postgres_13-bullseye/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec gosu postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_13-bullseye/docker-entrypoint.sh b/postgres_13-bullseye/docker-entrypoint.sh
index 0ae0ecf..6d197bc 100755
--- a/postgres_13-bullseye/docker-entrypoint.sh
+++ b/postgres_13-bullseye/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_14-alpine/Dockerfile b/postgres_14-alpine/Dockerfile
index ce011a9..8292d8e 100644
--- a/postgres_14-alpine/Dockerfile
+++ b/postgres_14-alpine/Dockerfile
@@ -170,7 +170,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_14-alpine/docker-ensure-initdb.sh b/postgres_14-alpine/docker-ensure-initdb.sh
new file mode 100755
index 0000000..2a97586
--- /dev/null
+++ b/postgres_14-alpine/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec su-exec postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_14-alpine/docker-entrypoint.sh b/postgres_14-alpine/docker-entrypoint.sh
index a383a36..151d75e 100755
--- a/postgres_14-alpine/docker-entrypoint.sh
+++ b/postgres_14-alpine/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_14-alpine3.18/Dockerfile b/postgres_14-alpine3.18/Dockerfile
index 4180502..3a1d96e 100644
--- a/postgres_14-alpine3.18/Dockerfile
+++ b/postgres_14-alpine3.18/Dockerfile
@@ -170,7 +170,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_14-alpine3.18/docker-ensure-initdb.sh b/postgres_14-alpine3.18/docker-ensure-initdb.sh
new file mode 100755
index 0000000..2a97586
--- /dev/null
+++ b/postgres_14-alpine3.18/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec su-exec postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_14-alpine3.18/docker-entrypoint.sh b/postgres_14-alpine3.18/docker-entrypoint.sh
index a383a36..151d75e 100755
--- a/postgres_14-alpine3.18/docker-entrypoint.sh
+++ b/postgres_14-alpine3.18/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_14-bookworm/Dockerfile b/postgres_14-bookworm/Dockerfile
index e99b242..4905043 100644
--- a/postgres_14-bookworm/Dockerfile
+++ b/postgres_14-bookworm/Dockerfile
@@ -184,7 +184,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_14-bookworm/docker-ensure-initdb.sh b/postgres_14-bookworm/docker-ensure-initdb.sh
new file mode 100755
index 0000000..ae1f6b6
--- /dev/null
+++ b/postgres_14-bookworm/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec gosu postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_14-bookworm/docker-entrypoint.sh b/postgres_14-bookworm/docker-entrypoint.sh
index 0ae0ecf..6d197bc 100755
--- a/postgres_14-bookworm/docker-entrypoint.sh
+++ b/postgres_14-bookworm/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_14-bullseye/Dockerfile b/postgres_14-bullseye/Dockerfile
index d8d3461..95e24e4 100644
--- a/postgres_14-bullseye/Dockerfile
+++ b/postgres_14-bullseye/Dockerfile
@@ -184,7 +184,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_14-bullseye/docker-ensure-initdb.sh b/postgres_14-bullseye/docker-ensure-initdb.sh
new file mode 100755
index 0000000..ae1f6b6
--- /dev/null
+++ b/postgres_14-bullseye/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec gosu postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_14-bullseye/docker-entrypoint.sh b/postgres_14-bullseye/docker-entrypoint.sh
index 0ae0ecf..6d197bc 100755
--- a/postgres_14-bullseye/docker-entrypoint.sh
+++ b/postgres_14-bullseye/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_15-alpine/Dockerfile b/postgres_15-alpine/Dockerfile
index 6389458..3dabd7e 100644
--- a/postgres_15-alpine/Dockerfile
+++ b/postgres_15-alpine/Dockerfile
@@ -173,7 +173,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_15-alpine/docker-ensure-initdb.sh b/postgres_15-alpine/docker-ensure-initdb.sh
new file mode 100755
index 0000000..2a97586
--- /dev/null
+++ b/postgres_15-alpine/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec su-exec postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_15-alpine/docker-entrypoint.sh b/postgres_15-alpine/docker-entrypoint.sh
index a383a36..151d75e 100755
--- a/postgres_15-alpine/docker-entrypoint.sh
+++ b/postgres_15-alpine/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_15-alpine3.18/Dockerfile b/postgres_15-alpine3.18/Dockerfile
index 63e59bb..d05d71b 100644
--- a/postgres_15-alpine3.18/Dockerfile
+++ b/postgres_15-alpine3.18/Dockerfile
@@ -173,7 +173,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_15-alpine3.18/docker-ensure-initdb.sh b/postgres_15-alpine3.18/docker-ensure-initdb.sh
new file mode 100755
index 0000000..2a97586
--- /dev/null
+++ b/postgres_15-alpine3.18/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec su-exec postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_15-alpine3.18/docker-entrypoint.sh b/postgres_15-alpine3.18/docker-entrypoint.sh
index a383a36..151d75e 100755
--- a/postgres_15-alpine3.18/docker-entrypoint.sh
+++ b/postgres_15-alpine3.18/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_15-bookworm/Dockerfile b/postgres_15-bookworm/Dockerfile
index e51062e..af0da3d 100644
--- a/postgres_15-bookworm/Dockerfile
+++ b/postgres_15-bookworm/Dockerfile
@@ -184,7 +184,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_15-bookworm/docker-ensure-initdb.sh b/postgres_15-bookworm/docker-ensure-initdb.sh
new file mode 100755
index 0000000..ae1f6b6
--- /dev/null
+++ b/postgres_15-bookworm/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec gosu postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_15-bookworm/docker-entrypoint.sh b/postgres_15-bookworm/docker-entrypoint.sh
index 0ae0ecf..6d197bc 100755
--- a/postgres_15-bookworm/docker-entrypoint.sh
+++ b/postgres_15-bookworm/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_15-bullseye/Dockerfile b/postgres_15-bullseye/Dockerfile
index 2bde901..2d9db9b 100644
--- a/postgres_15-bullseye/Dockerfile
+++ b/postgres_15-bullseye/Dockerfile
@@ -184,7 +184,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_15-bullseye/docker-ensure-initdb.sh b/postgres_15-bullseye/docker-ensure-initdb.sh
new file mode 100755
index 0000000..ae1f6b6
--- /dev/null
+++ b/postgres_15-bullseye/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec gosu postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_15-bullseye/docker-entrypoint.sh b/postgres_15-bullseye/docker-entrypoint.sh
index 0ae0ecf..6d197bc 100755
--- a/postgres_15-bullseye/docker-entrypoint.sh
+++ b/postgres_15-bullseye/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_alpine/Dockerfile b/postgres_alpine/Dockerfile
index 7abdc99..e934d38 100644
--- a/postgres_alpine/Dockerfile
+++ b/postgres_alpine/Dockerfile
@@ -172,7 +172,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_alpine/docker-ensure-initdb.sh b/postgres_alpine/docker-ensure-initdb.sh
new file mode 100755
index 0000000..2a97586
--- /dev/null
+++ b/postgres_alpine/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec su-exec postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_alpine/docker-entrypoint.sh b/postgres_alpine/docker-entrypoint.sh
index a383a36..151d75e 100755
--- a/postgres_alpine/docker-entrypoint.sh
+++ b/postgres_alpine/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_alpine3.18/Dockerfile b/postgres_alpine3.18/Dockerfile
index 626e269..2ea886d 100644
--- a/postgres_alpine3.18/Dockerfile
+++ b/postgres_alpine3.18/Dockerfile
@@ -172,7 +172,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_alpine3.18/docker-ensure-initdb.sh b/postgres_alpine3.18/docker-ensure-initdb.sh
new file mode 100755
index 0000000..2a97586
--- /dev/null
+++ b/postgres_alpine3.18/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec su-exec postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_alpine3.18/docker-entrypoint.sh b/postgres_alpine3.18/docker-entrypoint.sh
index a383a36..151d75e 100755
--- a/postgres_alpine3.18/docker-entrypoint.sh
+++ b/postgres_alpine3.18/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_bookworm/Dockerfile b/postgres_bookworm/Dockerfile
index 684c6ee..15369fd 100644
--- a/postgres_bookworm/Dockerfile
+++ b/postgres_bookworm/Dockerfile
@@ -184,7 +184,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_bookworm/docker-ensure-initdb.sh b/postgres_bookworm/docker-ensure-initdb.sh
new file mode 100755
index 0000000..ae1f6b6
--- /dev/null
+++ b/postgres_bookworm/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec gosu postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_bookworm/docker-entrypoint.sh b/postgres_bookworm/docker-entrypoint.sh
index 0ae0ecf..6d197bc 100755
--- a/postgres_bookworm/docker-entrypoint.sh
+++ b/postgres_bookworm/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true'
diff --git a/postgres_bullseye/Dockerfile b/postgres_bullseye/Dockerfile
index ecc31fc..b132cc2 100644
--- a/postgres_bullseye/Dockerfile
+++ b/postgres_bullseye/Dockerfile
@@ -184,7 +184,8 @@ ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA"
VOLUME /var/lib/postgresql/data
-COPY docker-entrypoint.sh /usr/local/bin/
+COPY docker-entrypoint.sh docker-ensure-initdb.sh /usr/local/bin/
+RUN ln -sT docker-ensure-initdb.sh /usr/local/bin/docker-enforce-initdb.sh
ENTRYPOINT ["docker-entrypoint.sh"]
# We set the default STOPSIGNAL to SIGINT, which corresponds to what PostgreSQL
diff --git a/postgres_bullseye/docker-ensure-initdb.sh b/postgres_bullseye/docker-ensure-initdb.sh
new file mode 100755
index 0000000..ae1f6b6
--- /dev/null
+++ b/postgres_bullseye/docker-ensure-initdb.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+#
+# This script is intended for three main use cases:
+#
+# 1. (most importantly) as an example of how to use "docker-entrypoint.sh" to extend/reuse the initialization behavior
+#
+# 2. ("docker-ensure-initdb.sh") as a Kubernetes "init container" to ensure the provided database directory is initialized; see also "startup probes" for an alternative solution
+# (no-op if database is already initialized)
+#
+# 3. ("docker-enforce-initdb.sh") as part of CI to ensure the database is fully initialized before use
+# (error if database is already initialized)
+#
+
+source /usr/local/bin/docker-entrypoint.sh
+
+# arguments to this script are assumed to be arguments to the "postgres" server (same as "docker-entrypoint.sh"), and most "docker-entrypoint.sh" functions assume "postgres" is the first argument (see "_main" over there)
+if [ "$#" -eq 0 ] || [ "$1" != 'postgres' ]; then
+ set -- postgres "$@"
+fi
+
+# see also "_main" in "docker-entrypoint.sh"
+
+docker_setup_env
+# setup data directories and permissions (when run as root)
+docker_create_db_directories
+if [ "$(id -u)" = '0' ]; then
+ # then restart script as postgres user
+ exec gosu postgres "$BASH_SOURCE" "$@"
+fi
+
+# only run initialization on an empty data directory
+if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+ docker_verify_minimum_env
+
+ # check dir permissions to reduce likelihood of half-initialized database
+ ls /docker-entrypoint-initdb.d/ > /dev/null
+
+ docker_init_database_dir
+ pg_setup_hba_conf "$@"
+
+ # PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
+ # e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
+ export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
+ docker_temp_server_start "$@"
+
+ docker_setup_db
+ docker_process_init_files /docker-entrypoint-initdb.d/*
+
+ docker_temp_server_stop
+ unset PGPASSWORD
+else
+ self="$(basename "$0")"
+ case "$self" in
+ docker-ensure-initdb.sh)
+ echo >&2 "$self: note: database already initialized in '$PGDATA'!"
+ exit 0
+ ;;
+
+ docker-enforce-initdb.sh)
+ echo >&2 "$self: error: (unexpected) database found in '$PGDATA'!"
+ exit 1
+ ;;
+
+ *)
+ echo >&2 "$self: error: unknown file name: $self"
+ exit 99
+ ;;
+ esac
+fi
diff --git a/postgres_bullseye/docker-entrypoint.sh b/postgres_bullseye/docker-entrypoint.sh
index 0ae0ecf..6d197bc 100755
--- a/postgres_bullseye/docker-entrypoint.sh
+++ b/postgres_bullseye/docker-entrypoint.sh
@@ -225,6 +225,7 @@ docker_setup_env() {
: "${POSTGRES_HOST_AUTH_METHOD:=}"
declare -g DATABASE_ALREADY_EXISTS
+ : "${DATABASE_ALREADY_EXISTS:=}"
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ -s "$PGDATA/PG_VERSION" ]; then
DATABASE_ALREADY_EXISTS='true' Relevant Maintainers: |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Changes: