|
| 1 | +# syntax=docker/dockerfile:1.6 |
| 2 | +ARG postgresql_major=15 |
| 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.1 |
| 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.3.0 |
| 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=2.0.1 |
| 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 | + && apt clean |
| 52 | + |
| 53 | + |
| 54 | +RUN adduser --system --home /var/lib/postgresql --no-create-home --shell /bin/bash --group --gecos "PostgreSQL administrator" postgres |
| 55 | +RUN adduser --system --no-create-home --shell /bin/bash --group wal-g |
| 56 | +RUN curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux \ |
| 57 | +--init none \ |
| 58 | +--no-confirm \ |
| 59 | +--extra-conf "substituters = https://cache.nixos.org https://nix-postgres-artifacts.s3.amazonaws.com" \ |
| 60 | +--extra-conf "trusted-public-keys = nix-postgres-artifacts:dGZlQOvKcNEjvT7QEAJbcV6b6uk7VF/hWMjhYleiaLI=% cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" |
| 61 | + |
| 62 | +ENV PATH="${PATH}:/nix/var/nix/profiles/default/bin" |
| 63 | + |
| 64 | +COPY . /nixpg |
| 65 | + |
| 66 | +WORKDIR /nixpg |
| 67 | + |
| 68 | +RUN nix profile install .#psql_15/bin |
| 69 | + |
| 70 | + |
| 71 | + |
| 72 | +WORKDIR / |
| 73 | + |
| 74 | + |
| 75 | +RUN mkdir -p /usr/lib/postgresql/bin \ |
| 76 | + /usr/lib/postgresql/share/postgresql \ |
| 77 | + /usr/share/postgresql \ |
| 78 | + # /usr/lib/postgresql/share/postgresql/contrib \ |
| 79 | + #/usr/lib/postgresql/share/postgresql/timezonesets \ |
| 80 | + #/usr/lib/postgresql/share/postgresql/tsearch_data \ |
| 81 | + # /usr/lib/postgresql/share/postgresql/extension \ |
| 82 | + && chown -R postgres:postgres /usr/lib/postgresql \ |
| 83 | + && chown -R postgres:postgres /usr/share/postgresql |
| 84 | + |
| 85 | +# Create symbolic links |
| 86 | +RUN ln -s /nix/var/nix/profiles/default/bin/* /usr/lib/postgresql/bin/ \ |
| 87 | + && ln -s /nix/var/nix/profiles/default/bin/* /usr/bin/ \ |
| 88 | + && chown -R postgres:postgres /usr/bin |
| 89 | + |
| 90 | +# Create symbolic links for PostgreSQL shares |
| 91 | +RUN ln -s /nix/var/nix/profiles/default/share/postgresql/* /usr/lib/postgresql/share/postgresql/ |
| 92 | +RUN ln -s /nix/var/nix/profiles/default/share/postgresql/* /usr/share/postgresql/ |
| 93 | +RUN chown -R postgres:postgres /usr/lib/postgresql/share/postgresql/ |
| 94 | +RUN chown -R postgres:postgres /usr/share/postgresql/ |
| 95 | +# Create symbolic links for contrib directory |
| 96 | +RUN mkdir -p /usr/lib/postgresql/share/postgresql/contrib \ |
| 97 | + && find /nix/var/nix/profiles/default/share/postgresql/contrib/ -mindepth 1 -type d -exec sh -c 'for dir do ln -s "$dir" "/usr/lib/postgresql/share/postgresql/contrib/$(basename "$dir")"; done' sh {} + \ |
| 98 | + && chown -R postgres:postgres /usr/lib/postgresql/share/postgresql/contrib/ |
| 99 | + |
| 100 | +RUN chown -R postgres:postgres /usr/lib/postgresql |
| 101 | + |
| 102 | +RUN ln -sf /usr/lib/postgresql/share/postgresql/timezonesets /usr/share/postgresql/timezonesets |
| 103 | + |
| 104 | + |
| 105 | +RUN apt-get update && \ |
| 106 | + apt-get install -y --no-install-recommends tzdata |
| 107 | + |
| 108 | +RUN ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime && \ |
| 109 | + dpkg-reconfigure --frontend noninteractive tzdata |
| 110 | + |
| 111 | +RUN apt-get update && \ |
| 112 | + apt-get install -y --no-install-recommends \ |
| 113 | + build-essential \ |
| 114 | + checkinstall \ |
| 115 | + cmake |
| 116 | + |
| 117 | +ENV PGDATA=/var/lib/postgresql/data |
| 118 | + |
| 119 | +#################### |
| 120 | +# setup-wal-g.yml |
| 121 | +#################### |
| 122 | +FROM base as walg |
| 123 | +ARG wal_g_release |
| 124 | +# ADD "https://github.com/wal-g/wal-g/releases/download/v${wal_g_release}/wal-g-pg-ubuntu-20.04-${TARGETARCH}.tar.gz" /tmp/wal-g.tar.gz |
| 125 | +RUN arch=$([ "$TARGETARCH" = "arm64" ] && echo "aarch64" || echo "$TARGETARCH") && \ |
| 126 | + apt-get update && apt-get install -y --no-install-recommends curl && \ |
| 127 | + curl -kL "https://github.com/wal-g/wal-g/releases/download/v${wal_g_release}/wal-g-pg-ubuntu-20.04-aarch64.tar.gz" -o /tmp/wal-g.tar.gz && \ |
| 128 | + tar -xvf /tmp/wal-g.tar.gz -C /tmp && \ |
| 129 | + rm -rf /tmp/wal-g.tar.gz && \ |
| 130 | + mv /tmp/wal-g-pg-ubuntu*20.04-aarch64 /tmp/wal-g |
| 131 | + |
| 132 | +# #################### |
| 133 | +# # Download gosu for easy step-down from root |
| 134 | +# #################### |
| 135 | +FROM base as gosu |
| 136 | +ARG TARGETARCH |
| 137 | +# Install dependencies |
| 138 | +RUN apt-get update && apt-get install -y --no-install-recommends \ |
| 139 | + gnupg \ |
| 140 | + ca-certificates \ |
| 141 | + && rm -rf /var/lib/apt/lists/* |
| 142 | +# Download binary |
| 143 | +ARG GOSU_VERSION=1.16 |
| 144 | +ARG GOSU_GPG_KEY=B42F6819007F00F88E364FD4036A9C25BF357DD4 |
| 145 | +ADD https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$TARGETARCH \ |
| 146 | + /usr/local/bin/gosu |
| 147 | +ADD https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$TARGETARCH.asc \ |
| 148 | + /usr/local/bin/gosu.asc |
| 149 | +# Verify checksum |
| 150 | +RUN gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys $GOSU_GPG_KEY && \ |
| 151 | + gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu && \ |
| 152 | + gpgconf --kill all && \ |
| 153 | + chmod +x /usr/local/bin/gosu |
| 154 | + |
| 155 | +# #################### |
| 156 | +# # Build final image |
| 157 | +# #################### |
| 158 | +FROM gosu as production |
| 159 | +RUN id postgres || (echo "postgres user does not exist" && exit 1) |
| 160 | +# # Setup extensions |
| 161 | +COPY --from=walg /tmp/wal-g /usr/local/bin/ |
| 162 | + |
| 163 | +# # Initialise configs |
| 164 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/postgresql.conf.j2 /etc/postgresql/postgresql.conf |
| 165 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/pg_hba.conf.j2 /etc/postgresql/pg_hba.conf |
| 166 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/pg_ident.conf.j2 /etc/postgresql/pg_ident.conf |
| 167 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/postgresql-stdout-log.conf /etc/postgresql/logging.conf |
| 168 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/supautils.conf.j2 /etc/postgresql-custom/supautils.conf |
| 169 | +COPY --chown=postgres:postgres ansible/files/postgresql_extension_custom_scripts /etc/postgresql-custom/extension-custom-scripts |
| 170 | +COPY --chown=postgres:postgres ansible/files/pgsodium_getkey_urandom.sh.j2 /usr/lib/postgresql/bin/pgsodium_getkey.sh |
| 171 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/custom_read_replica.conf.j2 /etc/postgresql-custom/read-replica.conf |
| 172 | +COPY --chown=postgres:postgres ansible/files/postgresql_config/custom_walg.conf.j2 /etc/postgresql-custom/wal-g.conf |
| 173 | +COPY --chown=postgres:postgres ansible/files/walg_helper_scripts/wal_fetch.sh /home/postgres/wal_fetch.sh |
| 174 | +COPY ansible/files/walg_helper_scripts/wal_change_ownership.sh /root/wal_change_ownership.sh |
| 175 | + |
| 176 | +RUN sed -i \ |
| 177 | + -e "s|#unix_socket_directories = '/tmp'|unix_socket_directories = '/var/run/postgresql'|g" \ |
| 178 | + -e "s|#session_preload_libraries = ''|session_preload_libraries = 'supautils'|g" \ |
| 179 | + -e "s|#include = '/etc/postgresql-custom/supautils.conf'|include = '/etc/postgresql-custom/supautils.conf'|g" \ |
| 180 | + -e "s|#include = '/etc/postgresql-custom/wal-g.conf'|include = '/etc/postgresql-custom/wal-g.conf'|g" /etc/postgresql/postgresql.conf && \ |
| 181 | + echo "cron.database_name = 'postgres'" >> /etc/postgresql/postgresql.conf && \ |
| 182 | + #echo "pljava.libjvm_location = '/usr/lib/jvm/java-11-openjdk-${TARGETARCH}/lib/server/libjvm.so'" >> /etc/postgresql/postgresql.conf && \ |
| 183 | + echo "pgsodium.getkey_script= '/usr/lib/postgresql/bin/pgsodium_getkey.sh'" >> /etc/postgresql/postgresql.conf && \ |
| 184 | + echo 'auto_explain.log_min_duration = 10s' >> /etc/postgresql/postgresql.conf && \ |
| 185 | + usermod -aG postgres wal-g && \ |
| 186 | + mkdir -p /etc/postgresql-custom && \ |
| 187 | + chown postgres:postgres /etc/postgresql-custom |
| 188 | + |
| 189 | +# # Include schema migrations |
| 190 | +COPY migrations/db /docker-entrypoint-initdb.d/ |
| 191 | +COPY ansible/files/pgbouncer_config/pgbouncer_auth_schema.sql /docker-entrypoint-initdb.d/init-scripts/00-schema.sql |
| 192 | +COPY ansible/files/stat_extension.sql /docker-entrypoint-initdb.d/migrations/00-extension.sql |
| 193 | + |
| 194 | +# # Add upstream entrypoint script |
| 195 | +COPY --from=gosu /usr/local/bin/gosu /usr/local/bin/gosu |
| 196 | +ADD --chmod=0755 \ |
| 197 | + https://github.com/docker-library/postgres/raw/master/15/bullseye/docker-entrypoint.sh \ |
| 198 | + /usr/local/bin/ |
| 199 | + |
| 200 | +RUN mkdir -p /var/run/postgresql && chown postgres:postgres /var/run/postgresql |
| 201 | + |
| 202 | +ENTRYPOINT ["docker-entrypoint.sh"] |
| 203 | + |
| 204 | +HEALTHCHECK --interval=2s --timeout=2s --retries=10 CMD pg_isready -U postgres -h localhost |
| 205 | +STOPSIGNAL SIGINT |
| 206 | +EXPOSE 5432 |
| 207 | + |
| 208 | +ENV POSTGRES_HOST=/var/run/postgresql |
| 209 | +RUN apt-get update && apt-get install -y --no-install-recommends \ |
| 210 | + locales \ |
| 211 | + && rm -rf /var/lib/apt/lists/* && \ |
| 212 | + localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 \ |
| 213 | + && localedef -i C -c -f UTF-8 -A /usr/share/locale/locale.alias C.UTF-8 |
| 214 | +RUN echo "C.UTF-8 UTF-8" > /etc/locale.gen && echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && locale-gen |
| 215 | +ENV LANG en_US.UTF-8 |
| 216 | +ENV LANGUAGE en_US:en |
| 217 | +ENV LC_ALL en_US.UTF-8 |
| 218 | +ENV LC_CTYPE=C.UTF-8 |
| 219 | +ENV LC_COLLATE=C.UTF-8 |
| 220 | +ENV LOCALE_ARCHIVE /usr/lib/locale/locale-archive |
| 221 | +CMD ["postgres", "-D", "/etc/postgresql"] |
| 222 | + |
0 commit comments