|
| 1 | +# syntax=docker/dockerfile:1.6 |
| 2 | +ARG postgresql_major=17-orioledb |
| 3 | +ARG postgresql_release=${postgresql_major}.1 |
| 4 | + |
| 5 | +# Bump default build arg to build a package from source |
| 6 | +# Bump vars.yml to specify runtime package version |
| 7 | +ARG sfcgal_release=1.3.10 |
| 8 | +ARG postgis_release=3.3.2 |
| 9 | +ARG pgrouting_release=3.4.1 |
| 10 | +ARG pgtap_release=1.2.0 |
| 11 | +ARG pg_cron_release=1.6.2 |
| 12 | +ARG pgaudit_release=1.7.0 |
| 13 | +ARG pgjwt_release=9742dab1b2f297ad3811120db7b21451bca2d3c9 |
| 14 | +ARG pgsql_http_release=1.5.0 |
| 15 | +ARG plpgsql_check_release=2.2.5 |
| 16 | +ARG pg_safeupdate_release=1.4 |
| 17 | +ARG timescaledb_release=2.9.1 |
| 18 | +ARG wal2json_release=2_5 |
| 19 | +ARG pljava_release=1.6.4 |
| 20 | +ARG plv8_release=3.1.5 |
| 21 | +ARG pg_plan_filter_release=5081a7b5cb890876e67d8e7486b6a64c38c9a492 |
| 22 | +ARG pg_net_release=0.7.1 |
| 23 | +ARG rum_release=1.3.13 |
| 24 | +ARG pg_hashids_release=cd0e1b31d52b394a0df64079406a14a4f7387cd6 |
| 25 | +ARG libsodium_release=1.0.18 |
| 26 | +ARG pgsodium_release=3.1.6 |
| 27 | +ARG pg_graphql_release=1.5.11 |
| 28 | +ARG pg_stat_monitor_release=1.1.1 |
| 29 | +ARG pg_jsonschema_release=0.1.4 |
| 30 | +ARG pg_repack_release=1.4.8 |
| 31 | +ARG vault_release=0.2.8 |
| 32 | +ARG groonga_release=12.0.8 |
| 33 | +ARG pgroonga_release=2.4.0 |
| 34 | +ARG wrappers_release=0.4.5 |
| 35 | +ARG hypopg_release=1.3.1 |
| 36 | +ARG pgvector_release=0.4.0 |
| 37 | +ARG pg_tle_release=1.3.2 |
| 38 | +ARG index_advisor_release=0.2.0 |
| 39 | +ARG supautils_release=2.2.0 |
| 40 | +ARG wal_g_release=3.0.5 |
| 41 | + |
| 42 | +FROM ubuntu:focal as base |
| 43 | + |
| 44 | +RUN apt update -y && apt install -y \ |
| 45 | + curl \ |
| 46 | + gnupg \ |
| 47 | + lsb-release \ |
| 48 | + software-properties-common \ |
| 49 | + wget \ |
| 50 | + sudo \ |
| 51 | + tree \ |
| 52 | + && apt clean |
| 53 | + |
| 54 | + |
| 55 | +RUN adduser --system --home /var/lib/postgresql --no-create-home --shell /bin/bash --group --gecos "PostgreSQL administrator" postgres |
| 56 | +RUN adduser --system --no-create-home --shell /bin/bash --group wal-g |
| 57 | +RUN curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux \ |
| 58 | +--init none \ |
| 59 | +--no-confirm \ |
| 60 | +--extra-conf "substituters = https://cache.nixos.org https://nix-postgres-artifacts.s3.amazonaws.com" \ |
| 61 | +--extra-conf "trusted-public-keys = nix-postgres-artifacts:dGZlQOvKcNEjvT7QEAJbcV6b6uk7VF/hWMjhYleiaLI=% cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" |
| 62 | + |
| 63 | +ENV PATH="${PATH}:/nix/var/nix/profiles/default/bin" |
| 64 | + |
| 65 | +COPY . /nixpg |
| 66 | + |
| 67 | +WORKDIR /nixpg |
| 68 | + |
| 69 | +RUN nix profile install .#psql_17/bin |
| 70 | + |
| 71 | +RUN nix store gc |
| 72 | + |
| 73 | +WORKDIR / |
| 74 | + |
| 75 | + |
| 76 | +RUN mkdir -p /usr/lib/postgresql/bin \ |
| 77 | + /usr/lib/postgresql/share/postgresql \ |
| 78 | + /usr/share/postgresql \ |
| 79 | + /var/lib/postgresql \ |
| 80 | + && chown -R postgres:postgres /usr/lib/postgresql \ |
| 81 | + && chown -R postgres:postgres /var/lib/postgresql \ |
| 82 | + && chown -R postgres:postgres /usr/share/postgresql |
| 83 | + |
| 84 | +# Create symbolic links |
| 85 | +RUN ln -s /nix/var/nix/profiles/default/bin/* /usr/lib/postgresql/bin/ \ |
| 86 | + && ln -s /nix/var/nix/profiles/default/bin/* /usr/bin/ \ |
| 87 | + && chown -R postgres:postgres /usr/bin |
| 88 | + |
| 89 | +# Create symbolic links for PostgreSQL shares |
| 90 | +RUN ln -s /nix/var/nix/profiles/default/share/postgresql/* /usr/lib/postgresql/share/postgresql/ |
| 91 | +RUN ln -s /nix/var/nix/profiles/default/share/postgresql/* /usr/share/postgresql/ |
| 92 | +RUN chown -R postgres:postgres /usr/lib/postgresql/share/postgresql/ |
| 93 | +RUN chown -R postgres:postgres /usr/share/postgresql/ |
| 94 | +# Create symbolic links for contrib directory |
| 95 | +RUN tree /nix > /tmp/tree.txt && cat /tmp/tree.txt && cat /tmp/tree.txt >&2 |
| 96 | + |
| 97 | +RUN chown -R postgres:postgres /usr/lib/postgresql |
| 98 | + |
| 99 | +RUN ln -sf /usr/lib/postgresql/share/postgresql/timezonesets /usr/share/postgresql/timezonesets |
| 100 | + |
| 101 | + |
| 102 | +RUN apt-get update && \ |
| 103 | + apt-get install -y --no-install-recommends tzdata |
| 104 | + |
| 105 | +RUN ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime && \ |
| 106 | + dpkg-reconfigure --frontend noninteractive tzdata |
| 107 | + |
| 108 | +RUN apt-get update && \ |
| 109 | + apt-get install -y --no-install-recommends \ |
| 110 | + build-essential \ |
| 111 | + checkinstall \ |
| 112 | + cmake |
| 113 | + |
| 114 | +ENV PGDATA=/var/lib/postgresql/data |
| 115 | + |
| 116 | +#################### |
| 117 | +# setup-wal-g.yml |
| 118 | +#################### |
| 119 | +FROM base as walg |
| 120 | +ARG wal_g_release |
| 121 | + |
| 122 | +WORKDIR /nixpg |
| 123 | + |
| 124 | +RUN nix profile install .#wal-g-3 && \ |
| 125 | + ln -s /nix/var/nix/profiles/default/bin/wal-g-3 /tmp/wal-g |
| 126 | + |
| 127 | +RUN nix store gc |
| 128 | + |
| 129 | +WORKDIR / |
| 130 | +# #################### |
| 131 | +# # Download gosu for easy step-down from root |
| 132 | +# #################### |
| 133 | +FROM base as gosu |
| 134 | +ARG TARGETARCH |
| 135 | +# Install dependencies |
| 136 | +RUN apt-get update && apt-get install -y --no-install-recommends \ |
| 137 | + gnupg \ |
| 138 | + ca-certificates \ |
| 139 | + && rm -rf /var/lib/apt/lists/* |
| 140 | +# Download binary |
| 141 | +ARG GOSU_VERSION=1.16 |
| 142 | +ARG GOSU_GPG_KEY=B42F6819007F00F88E364FD4036A9C25BF357DD4 |
| 143 | +ADD https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$TARGETARCH \ |
| 144 | + /usr/local/bin/gosu |
| 145 | +ADD https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$TARGETARCH.asc \ |
| 146 | + /usr/local/bin/gosu.asc |
| 147 | +# Verify checksum |
| 148 | +RUN gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys $GOSU_GPG_KEY && \ |
| 149 | + gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu && \ |
| 150 | + gpgconf --kill all && \ |
| 151 | + chmod +x /usr/local/bin/gosu |
| 152 | + |
| 153 | +# #################### |
| 154 | +# # Build final image |
| 155 | +# #################### |
| 156 | +FROM gosu as production |
| 157 | +RUN id postgres || (echo "postgres user does not exist" && exit 1) |
| 158 | +# # Setup extensions |
| 159 | +COPY --from=walg /tmp/wal-g /usr/local/bin/ |
| 160 | + |
| 161 | +# # Initialise configs |
| 162 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/postgresql.conf.j2 /etc/postgresql/postgresql.conf |
| 163 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/pg_hba.conf.j2 /etc/postgresql/pg_hba.conf |
| 164 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/pg_ident.conf.j2 /etc/postgresql/pg_ident.conf |
| 165 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/postgresql-stdout-log.conf /etc/postgresql/logging.conf |
| 166 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/supautils.conf.j2 /etc/postgresql-custom/supautils.conf |
| 167 | +COPY --chown=postgres:postgres ansible/files/postgresql_extension_custom_scripts /etc/postgresql-custom/extension-custom-scripts |
| 168 | +COPY --chown=postgres:postgres ansible/files/pgsodium_getkey_urandom.sh.j2 /usr/lib/postgresql/bin/pgsodium_getkey.sh |
| 169 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/custom_read_replica.conf.j2 /etc/postgresql-custom/read-replica.conf |
| 170 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/custom_walg.conf.j2 /etc/postgresql-custom/wal-g.conf |
| 171 | +COPY --chown=postgres:postgres ansible/files/walg_helper_scripts/wal_fetch.sh /home/postgres/wal_fetch.sh |
| 172 | +COPY ansible/files/walg_helper_scripts/wal_change_ownership.sh /root/wal_change_ownership.sh |
| 173 | + |
| 174 | +RUN sed -i \ |
| 175 | + -e "s|#unix_socket_directories = '/tmp'|unix_socket_directories = '/var/run/postgresql'|g" \ |
| 176 | + -e "s|#session_preload_libraries = ''|session_preload_libraries = 'supautils'|g" \ |
| 177 | + -e "s|#include = '/etc/postgresql-custom/supautils.conf'|include = '/etc/postgresql-custom/supautils.conf'|g" \ |
| 178 | + -e "s|#include = '/etc/postgresql-custom/wal-g.conf'|include = '/etc/postgresql-custom/wal-g.conf'|g" /etc/postgresql/postgresql.conf && \ |
| 179 | + echo "cron.database_name = 'postgres'" >> /etc/postgresql/postgresql.conf && \ |
| 180 | + #echo "pljava.libjvm_location = '/usr/lib/jvm/java-11-openjdk-${TARGETARCH}/lib/server/libjvm.so'" >> /etc/postgresql/postgresql.conf && \ |
| 181 | + echo "pgsodium.getkey_script= '/usr/lib/postgresql/bin/pgsodium_getkey.sh'" >> /etc/postgresql/postgresql.conf && \ |
| 182 | + echo "vault.getkey_script= '/usr/lib/postgresql/bin/pgsodium_getkey.sh'" >> /etc/postgresql/postgresql.conf && \ |
| 183 | + echo 'auto_explain.log_min_duration = 10s' >> /etc/postgresql/postgresql.conf && \ |
| 184 | + usermod -aG postgres wal-g && \ |
| 185 | + mkdir -p /etc/postgresql-custom && \ |
| 186 | + chown postgres:postgres /etc/postgresql-custom |
| 187 | + |
| 188 | + # Remove items from postgresql.conf |
| 189 | +RUN sed -i 's/ timescaledb,//g;' "/etc/postgresql/postgresql.conf" |
| 190 | + #as of pg 16.4 + this db_user_namespace totally deprecated and will break the server if setting is present |
| 191 | +RUN sed -i 's/db_user_namespace = off/#db_user_namespace = off/g;' "/etc/postgresql/postgresql.conf" |
| 192 | +RUN sed -i 's/ timescaledb,//g; s/ plv8,//g' "/etc/postgresql-custom/supautils.conf" |
| 193 | + |
| 194 | + |
| 195 | + |
| 196 | +# # Include schema migrations |
| 197 | +COPY migrations/db /docker-entrypoint-initdb.d/ |
| 198 | +COPY ansible/files/pgbouncer_config/pgbouncer_auth_schema.sql /docker-entrypoint-initdb.d/init-scripts/00-schema.sql |
| 199 | +COPY ansible/files/stat_extension.sql /docker-entrypoint-initdb.d/migrations/00-extension.sql |
| 200 | + |
| 201 | +# # Add upstream entrypoint script |
| 202 | +COPY --from=gosu /usr/local/bin/gosu /usr/local/bin/gosu |
| 203 | +ADD --chmod=0755 \ |
| 204 | + https://github.com/docker-library/postgres/raw/master/17/bullseye/docker-entrypoint.sh \ |
| 205 | + /usr/local/bin/ |
| 206 | + |
| 207 | +RUN mkdir -p /var/run/postgresql && chown postgres:postgres /var/run/postgresql |
| 208 | + |
| 209 | +ENTRYPOINT ["docker-entrypoint.sh"] |
| 210 | + |
| 211 | +HEALTHCHECK --interval=2s --timeout=2s --retries=10 CMD pg_isready -U postgres -h localhost |
| 212 | +STOPSIGNAL SIGINT |
| 213 | +EXPOSE 5432 |
| 214 | + |
| 215 | +ENV POSTGRES_HOST=/var/run/postgresql |
| 216 | +ENV POSTGRES_USER=supabase_admin |
| 217 | +ENV POSTGRES_DB=postgres |
| 218 | +ENV POSTGRES_INITDB_ARGS="--allow-group-access --locale-provider=icu --encoding=UTF-8 --icu-locale=en_US.UTF-8" |
| 219 | +RUN apt-get update && apt-get install -y --no-install-recommends \ |
| 220 | + locales \ |
| 221 | + && rm -rf /var/lib/apt/lists/* && \ |
| 222 | + localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 \ |
| 223 | + && localedef -i C -c -f UTF-8 -A /usr/share/locale/locale.alias C.UTF-8 |
| 224 | +RUN echo "C.UTF-8 UTF-8" > /etc/locale.gen && echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && locale-gen |
| 225 | +ENV LANG en_US.UTF-8 |
| 226 | +ENV LANGUAGE en_US:en |
| 227 | +ENV LC_ALL en_US.UTF-8 |
| 228 | +ENV LC_CTYPE=C.UTF-8 |
| 229 | +ENV LC_COLLATE=C.UTF-8 |
| 230 | +ENV LOCALE_ARCHIVE /usr/lib/locale/locale-archive |
| 231 | +RUN mkdir -p /usr/share/postgresql/extension/ && \ |
| 232 | + ln -s /usr/lib/postgresql/bin/pgsodium_getkey.sh /usr/share/postgresql/extension/pgsodium_getkey && \ |
| 233 | + chmod +x /usr/lib/postgresql/bin/pgsodium_getkey.sh |
| 234 | +CMD ["postgres", "-D", "/etc/postgresql"] |
0 commit comments