-
Notifications
You must be signed in to change notification settings - Fork 16
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #251 from qiangxuhui/main
add postgres-15
- Loading branch information
Showing
4 changed files
with
678 additions
and
0 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,223 @@ | ||
# | ||
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" | ||
# | ||
# PLEASE DO NOT EDIT IT DIRECTLY. | ||
# | ||
|
||
FROM cr.loongnix.cn/library/alpine:3.11 | ||
|
||
# 70 is the standard uid/gid for "postgres" in Alpine | ||
# https://git.alpinelinux.org/aports/tree/main/postgresql/postgresql.pre-install?h=3.12-stable | ||
RUN set -eux; \ | ||
addgroup -g 70 -S postgres; \ | ||
adduser -u 70 -S -D -G postgres -H -h /var/lib/postgresql -s /bin/sh postgres; \ | ||
# also create the postgres user's home directory with appropriate permissions | ||
# see https://github.com/docker-library/postgres/issues/274 | ||
install -d -o postgres -g postgres -m 1777 /var/lib/postgresql | ||
|
||
# grab gosu for easy step-down from root | ||
# https://github.com/tianon/gosu/releases | ||
ENV GOSU_VERSION 1.17 | ||
RUN set -eux; \ | ||
\ | ||
apk add --no-cache --virtual .gosu-deps \ | ||
ca-certificates \ | ||
dpkg \ | ||
gnupg \ | ||
; \ | ||
\ | ||
dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \ | ||
wget -O /usr/local/bin/gosu "https://github.com/Loongson-Cloud-Community/gosu/releases/download/loongarch64-old-abi-1.17/gosu-loongarch64"; \ | ||
chmod +x /usr/local/bin/gosu; \ | ||
# verify that the binary works | ||
gosu --version; \ | ||
gosu nobody true | ||
RUN set -eux; ln -svf gosu /usr/local/bin/su-exec; su-exec nobody true # backwards compatibility (removed in PostgreSQL 17+) | ||
|
||
# make the "en_US.UTF-8" locale so postgres will be utf-8 enabled by default | ||
# alpine doesn't require explicit locale-file generation | ||
ENV LANG en_US.utf8 | ||
|
||
RUN mkdir /docker-entrypoint-initdb.d | ||
|
||
ENV PG_MAJOR 15 | ||
ENV PG_VERSION 15.7 | ||
ENV PG_SHA256 a46fe49485ab6385e39dabbbb654f5d3049206f76cd695e224268729520998f7 | ||
|
||
|
||
RUN set -eux; \ | ||
\ | ||
wget -O postgresql.tar.bz2 "https://ftp.postgresql.org/pub/source/v$PG_VERSION/postgresql-$PG_VERSION.tar.bz2"; \ | ||
echo "$PG_SHA256 *postgresql.tar.bz2" | sha256sum -c -; \ | ||
mkdir -p /usr/src/postgresql; \ | ||
tar \ | ||
--extract \ | ||
--file postgresql.tar.bz2 \ | ||
--directory /usr/src/postgresql \ | ||
--strip-components 1 \ | ||
; \ | ||
rm postgresql.tar.bz2; \ | ||
\ | ||
apk add --no-cache --virtual .build-deps \ | ||
bison \ | ||
coreutils \ | ||
dpkg-dev dpkg \ | ||
flex \ | ||
g++ \ | ||
gcc \ | ||
krb5-dev \ | ||
libc-dev \ | ||
libedit-dev \ | ||
libxml2-dev \ | ||
libxslt-dev \ | ||
linux-headers \ | ||
make \ | ||
openldap-dev \ | ||
openssl-dev \ | ||
perl-dev \ | ||
perl-ipc-run \ | ||
perl-utils \ | ||
python3-dev \ | ||
tcl-dev \ | ||
util-linux-dev \ | ||
zlib-dev \ | ||
# https://www.postgresql.org/docs/10/static/release-10.html#id-1.11.6.9.5.13 | ||
# icu-dev \ | ||
# https://www.postgresql.org/docs/14/release-14.html#id-1.11.6.5.5.3.7 | ||
lz4-dev \ | ||
# https://www.postgresql.org/docs/15/release-15.html "--with-zstd to enable Zstandard builds" | ||
zstd-dev \ | ||
curl \ | ||
; \ | ||
\ | ||
cd /usr/src/postgresql; \ | ||
# update "DEFAULT_PGSOCKET_DIR" to "/var/run/postgresql" (matching Debian) | ||
# see https://anonscm.debian.org/git/pkg-postgresql/postgresql.git/tree/debian/patches/51-default-sockets-in-var.patch?id=8b539fcb3e093a521c095e70bdfa76887217b89f | ||
awk '$1 == "#define" && $2 == "DEFAULT_PGSOCKET_DIR" && $3 == "\"/tmp\"" { $3 = "\"/var/run/postgresql\""; print; next } { print }' src/include/pg_config_manual.h > src/include/pg_config_manual.h.new; \ | ||
grep '/var/run/postgresql' src/include/pg_config_manual.h.new; \ | ||
mv src/include/pg_config_manual.h.new src/include/pg_config_manual.h; \ | ||
gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \ | ||
# explicitly update autoconf config.guess and config.sub so they support more arches/libcs | ||
# curl -sL -o config.guess 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' \ | ||
# curl -sL -o config.sub 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' \ | ||
\ | ||
# configure options taken from: | ||
# https://anonscm.debian.org/cgit/pkg-postgresql/postgresql.git/tree/debian/rules?h=9.5 | ||
./configure \ | ||
--enable-option-checking=fatal \ | ||
# --build="$gnuArch" \ | ||
# "/usr/src/postgresql/src/backend/access/common/tupconvert.c:105: undefined reference to `libintl_gettext'" | ||
# --enable-nls \ | ||
--enable-integer-datetimes \ | ||
--enable-thread-safety \ | ||
--enable-tap-tests \ | ||
# skip debugging info -- we want tiny size instead | ||
# --enable-debug \ | ||
--disable-rpath \ | ||
--with-uuid=e2fs \ | ||
--with-gnu-ld \ | ||
--with-pgport=5432 \ | ||
--with-system-tzdata=/usr/share/zoneinfo \ | ||
--prefix=/usr/local \ | ||
--with-includes=/usr/local/include \ | ||
--with-libraries=/usr/local/lib \ | ||
--with-gssapi \ | ||
--with-ldap \ | ||
--with-tcl \ | ||
--with-perl \ | ||
--with-python \ | ||
# --with-pam \ | ||
--with-openssl \ | ||
--with-libxml \ | ||
--with-libxslt \ | ||
# --with-icu \ | ||
# --with-llvm \ | ||
--with-lz4 \ | ||
--with-zstd \ | ||
--disable-spinlocks \ | ||
; \ | ||
make -j "$(nproc)" world-bin; \ | ||
make install-world-bin; \ | ||
make -C contrib install; \ | ||
\ | ||
runDeps="$( \ | ||
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \ | ||
| tr ',' '\n' \ | ||
| sort -u \ | ||
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ | ||
# Remove plperl, plpython and pltcl dependencies by default to save image size | ||
# To use the pl extensions, those have to be installed in a derived image | ||
| grep -v -e perl -e python -e tcl \ | ||
)"; \ | ||
apk add --no-cache --virtual .postgresql-rundeps \ | ||
$runDeps \ | ||
bash \ | ||
tzdata \ | ||
zstd \ | ||
# https://wiki.alpinelinux.org/wiki/Release_Notes_for_Alpine_3.16.0#ICU_data_split | ||
# icu-data-full \ | ||
# nss_wrapper is not availble on ppc64le: "test case segfaults in ppc64le" | ||
# https://git.alpinelinux.org/aports/commit/testing/nss_wrapper/APKBUILD?h=3.17-stable&id=94d81ceeb58cff448d489bbcbe9a6d40c9991663 | ||
# $([ "$(apk --print-arch)" != 'ppc64le' ] && echo 'nss_wrapper') \ | ||
; \ | ||
apk del --no-network .build-deps; \ | ||
cd /; \ | ||
rm -rf \ | ||
/usr/src/postgresql \ | ||
/usr/local/share/doc \ | ||
/usr/local/share/man \ | ||
; \ | ||
\ | ||
postgres --version | ||
|
||
# make the sample config easier to munge (and "correct by default") | ||
RUN set -eux; \ | ||
cp -v /usr/local/share/postgresql/postgresql.conf.sample /usr/local/share/postgresql/postgresql.conf.sample.orig; \ | ||
sed -ri "s!^#?(listen_addresses)\s*=\s*\S+.*!\1 = '*'!" /usr/local/share/postgresql/postgresql.conf.sample; \ | ||
grep -F "listen_addresses = '*'" /usr/local/share/postgresql/postgresql.conf.sample | ||
|
||
# RUN install --verbose --directory --owner postgres --group postgres --mode 3777 /var/run/postgresql | ||
RUN install -d -o postgres -g postgres -m 3777 /var/run/postgresql | ||
|
||
ENV PGDATA /var/lib/postgresql/data | ||
# this 1777 will be replaced by 0700 at runtime (allows semi-arbitrary "--user" values) | ||
#RUN install --verbose --directory --owner postgres --group postgres --mode 1777 "$PGDATA" | ||
RUN install -d -o postgres -g postgres -m 1777 "$PGDATA" | ||
VOLUME /var/lib/postgresql/data | ||
|
||
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 | ||
# calls "Fast Shutdown mode" wherein new connections are disallowed and any | ||
# in-progress transactions are aborted, allowing PostgreSQL to stop cleanly and | ||
# flush tables to disk, which is the best compromise available to avoid data | ||
# corruption. | ||
# | ||
# Users who know their applications do not keep open long-lived idle connections | ||
# may way to use a value of SIGTERM instead, which corresponds to "Smart | ||
# Shutdown mode" in which any existing sessions are allowed to finish and the | ||
# server stops when all sessions are terminated. | ||
# | ||
# See https://www.postgresql.org/docs/12/server-shutdown.html for more details | ||
# about available PostgreSQL server shutdown signals. | ||
# | ||
# See also https://www.postgresql.org/docs/12/server-start.html for further | ||
# justification of this as the default value, namely that the example (and | ||
# shipped) systemd service files use the "Fast Shutdown mode" for service | ||
# termination. | ||
# | ||
STOPSIGNAL SIGINT | ||
# | ||
# An additional setting that is recommended for all users regardless of this | ||
# value is the runtime "--stop-timeout" (or your orchestrator/runtime's | ||
# equivalent) for controlling how long to wait between sending the defined | ||
# STOPSIGNAL and sending SIGKILL (which is likely to cause data corruption). | ||
# | ||
# The default in most runtimes (such as Docker) is 10 seconds, and the | ||
# documentation at https://www.postgresql.org/docs/12/server-start.html notes | ||
# that even 90 seconds may not be long enough in many instances. | ||
|
||
EXPOSE 5432 | ||
CMD ["postgres"] |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# This file is generated by the template. | ||
|
||
REGISTRY?=cr.loongnix.cn | ||
ORGANIZATION?=library | ||
REPOSITORY?=postgres | ||
TAG?=15-alpine | ||
LATEST?=true | ||
|
||
IMAGE=$(REGISTRY)/$(ORGANIZATION)/$(REPOSITORY):$(TAG) | ||
LATEST_IMAGE=$(REGISTRY)/$(ORGANIZATION)/$(REPOSITORY):latest | ||
|
||
default: image | ||
|
||
image: | ||
docker build \ | ||
--build-arg http_proxy=$(http_proxy) \ | ||
--build-arg https_proxy=$(https_proxy) \ | ||
-t $(IMAGE) \ | ||
. | ||
|
||
push: | ||
docker push $(IMAGE) | ||
#latest image | ||
@if [ $(LATEST) = "true" ]; \ | ||
then \ | ||
docker tag $(IMAGE) $(LATEST_IMAGE); \ | ||
docker push $(LATEST_IMAGE); \ | ||
fi |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
Oops, something went wrong.