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.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
+ 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_orioledb-17/bin
70
+
71
+
72
+
73
+ WORKDIR /
74
+
75
+
76
+ RUN mkdir -p /usr/lib/postgresql/bin \
77
+ /usr/lib/postgresql/share/postgresql \
78
+ /usr/share/postgresql \
79
+ # /usr/lib/postgresql/share/postgresql/contrib \
80
+ #/usr/lib/postgresql/share/postgresql/timezonesets \
81
+ #/usr/lib/postgresql/share/postgresql/tsearch_data \
82
+ # /usr/lib/postgresql/share/postgresql/extension \
83
+ && chown -R postgres:postgres /usr/lib/postgresql \
84
+ && chown -R postgres:postgres /usr/share/postgresql
85
+
86
+ # Create symbolic links
87
+ RUN ln -s /nix/var/nix/profiles/default/bin/* /usr/lib/postgresql/bin/ \
88
+ && ln -s /nix/var/nix/profiles/default/bin/* /usr/bin/ \
89
+ && chown -R postgres:postgres /usr/bin
90
+
91
+ # Create symbolic links for PostgreSQL shares
92
+ RUN ln -s /nix/var/nix/profiles/default/share/postgresql/* /usr/lib/postgresql/share/postgresql/
93
+ RUN ln -s /nix/var/nix/profiles/default/share/postgresql/* /usr/share/postgresql/
94
+ RUN chown -R postgres:postgres /usr/lib/postgresql/share/postgresql/
95
+ RUN chown -R postgres:postgres /usr/share/postgresql/
96
+ # Create symbolic links for contrib directory
97
+ RUN tree /nix > /tmp/tree.txt && cat /tmp/tree.txt && cat /tmp/tree.txt >&2
98
+
99
+
100
+ # RUN mkdir -p /usr/lib/postgresql/share/postgresql/contrib \
101
+ # && 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 {} + \
102
+ # && chown -R postgres:postgres /usr/lib/postgresql/share/postgresql/contrib/
103
+
104
+ RUN chown -R postgres:postgres /usr/lib/postgresql
105
+
106
+ RUN ln -sf /usr/lib/postgresql/share/postgresql/timezonesets /usr/share/postgresql/timezonesets
107
+
108
+
109
+ RUN apt-get update && \
110
+ apt-get install -y --no-install-recommends tzdata
111
+
112
+ RUN ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime && \
113
+ dpkg-reconfigure --frontend noninteractive tzdata
114
+
115
+ RUN apt-get update && \
116
+ apt-get install -y --no-install-recommends \
117
+ build-essential \
118
+ checkinstall \
119
+ cmake
120
+
121
+ ENV PGDATA=/var/lib/postgresql/data
122
+
123
+ ####################
124
+ # setup-wal-g.yml
125
+ ####################
126
+ FROM base as walg
127
+ ARG wal_g_release
128
+ # 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
129
+ RUN arch=$([ "$TARGETARCH" = "arm64" ] && echo "aarch64" || echo "$TARGETARCH") && \
130
+ apt-get update && apt-get install -y --no-install-recommends curl && \
131
+ 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 && \
132
+ tar -xvf /tmp/wal-g.tar.gz -C /tmp && \
133
+ rm -rf /tmp/wal-g.tar.gz && \
134
+ mv /tmp/wal-g-pg-ubuntu*20.04-aarch64 /tmp/wal-g
135
+
136
+ # ####################
137
+ # # Download gosu for easy step-down from root
138
+ # ####################
139
+ FROM base as gosu
140
+ ARG TARGETARCH
141
+ # Install dependencies
142
+ RUN apt-get update && apt-get install -y --no-install-recommends \
143
+ gnupg \
144
+ ca-certificates \
145
+ && rm -rf /var/lib/apt/lists/*
146
+ # Download binary
147
+ ARG GOSU_VERSION=1.16
148
+ ARG GOSU_GPG_KEY=B42F6819007F00F88E364FD4036A9C25BF357DD4
149
+ ADD https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$TARGETARCH \
150
+ /usr/local/bin/gosu
151
+ ADD https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$TARGETARCH.asc \
152
+ /usr/local/bin/gosu.asc
153
+ # Verify checksum
154
+ RUN gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys $GOSU_GPG_KEY && \
155
+ gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu && \
156
+ gpgconf --kill all && \
157
+ chmod +x /usr/local/bin/gosu
158
+
159
+ # ####################
160
+ # # Build final image
161
+ # ####################
162
+ FROM gosu as production
163
+ RUN id postgres || (echo "postgres user does not exist" && exit 1)
164
+ # # Setup extensions
165
+ COPY --from=walg /tmp/wal-g /usr/local/bin/
166
+
167
+ # # Initialise configs
168
+ COPY --chown=postgres:postgres ansible/files/postgresql_config/postgresql.conf.j2 /etc/postgresql/postgresql.conf
169
+ COPY --chown=postgres:postgres ansible/files/postgresql_config/pg_hba.conf.j2 /etc/postgresql/pg_hba.conf
170
+ COPY --chown=postgres:postgres ansible/files/postgresql_config/pg_ident.conf.j2 /etc/postgresql/pg_ident.conf
171
+ COPY --chown=postgres:postgres ansible/files/postgresql_config/postgresql-stdout-log.conf /etc/postgresql/logging.conf
172
+ COPY --chown=postgres:postgres ansible/files/postgresql_config/supautils.conf.j2 /etc/postgresql-custom/supautils.conf
173
+ COPY --chown=postgres:postgres ansible/files/postgresql_extension_custom_scripts /etc/postgresql-custom/extension-custom-scripts
174
+ COPY --chown=postgres:postgres ansible/files/pgsodium_getkey_urandom.sh.j2 /usr/lib/postgresql/bin/pgsodium_getkey.sh
175
+ COPY --chown=postgres:postgres ansible/files/postgresql_config/custom_read_replica.conf.j2 /etc/postgresql-custom/read-replica.conf
176
+ COPY --chown=postgres:postgres ansible/files/postgresql_config/custom_walg.conf.j2 /etc/postgresql-custom/wal-g.conf
177
+ COPY --chown=postgres:postgres ansible/files/walg_helper_scripts/wal_fetch.sh /home/postgres/wal_fetch.sh
178
+ COPY ansible/files/walg_helper_scripts/wal_change_ownership.sh /root/wal_change_ownership.sh
179
+
180
+ RUN sed -i \
181
+ -e "s|#unix_socket_directories = '/tmp'|unix_socket_directories = '/var/run/postgresql'|g" \
182
+ -e "s|#session_preload_libraries = ''|session_preload_libraries = 'supautils'|g" \
183
+ -e "s|#include = '/etc/postgresql-custom/supautils.conf'|include = '/etc/postgresql-custom/supautils.conf'|g" \
184
+ -e "s|#include = '/etc/postgresql-custom/wal-g.conf'|include = '/etc/postgresql-custom/wal-g.conf'|g" /etc/postgresql/postgresql.conf && \
185
+ echo "cron.database_name = 'postgres'" >> /etc/postgresql/postgresql.conf && \
186
+ #echo "pljava.libjvm_location = '/usr/lib/jvm/java-11-openjdk-${TARGETARCH}/lib/server/libjvm.so'" >> /etc/postgresql/postgresql.conf && \
187
+ echo "pgsodium.getkey_script= '/usr/lib/postgresql/bin/pgsodium_getkey.sh'" >> /etc/postgresql/postgresql.conf && \
188
+ echo 'auto_explain.log_min_duration = 10s' >> /etc/postgresql/postgresql.conf && \
189
+ usermod -aG postgres wal-g && \
190
+ mkdir -p /etc/postgresql-custom && \
191
+ chown postgres:postgres /etc/postgresql-custom
192
+
193
+ # Remove items from postgresql.conf
194
+ RUN sed -i 's/ timescaledb,//g;' "/etc/postgresql/postgresql.conf"
195
+ #as of pg 16.4 + this db_user_namespace totally deprecated and will break the server if setting is present
196
+ RUN sed -i 's/db_user_namespace = off/#db_user_namespace = off/g;' "/etc/postgresql/postgresql.conf"
197
+ RUN sed -i 's/ timescaledb,//g; s/ plv8,//g; s/ postgis,//g; s/ pgrouting,//g' "/etc/postgresql-custom/supautils.conf"
198
+ RUN sed -i 's/\(shared_preload_libraries.*\)'\''\(.*\)$/\1, orioledb'\''\2/' "/etc/postgresql/postgresql.conf"
199
+ RUN echo "default_table_access_method = 'orioledb'" >> "/etc/postgresql/postgresql.conf"
200
+
201
+
202
+
203
+ # # Include schema migrations
204
+ COPY migrations/db /docker-entrypoint-initdb.d/
205
+ COPY ansible/files/pgbouncer_config/pgbouncer_auth_schema.sql /docker-entrypoint-initdb.d/init-scripts/00-schema.sql
206
+ COPY ansible/files/stat_extension.sql /docker-entrypoint-initdb.d/migrations/00-extension.sql
207
+ # Enable orioledb extension first
208
+ RUN echo "CREATE EXTENSION orioledb;" > /docker-entrypoint-initdb.d/init-scripts/00-pre-init.sql && \
209
+ chown postgres:postgres /docker-entrypoint-initdb.d/init-scripts/00-pre-init.sql
210
+
211
+ # # Add upstream entrypoint script
212
+ COPY --from=gosu /usr/local/bin/gosu /usr/local/bin/gosu
213
+ ADD --chmod=0755 \
214
+ https://github.com/docker-library/postgres/raw/master/17/bullseye/docker-entrypoint.sh \
215
+ /usr/local/bin/
216
+
217
+ RUN mkdir -p /var/run/postgresql && chown postgres:postgres /var/run/postgresql
218
+
219
+ ENTRYPOINT ["docker-entrypoint.sh"]
220
+
221
+ HEALTHCHECK --interval=2s --timeout=2s --retries=10 CMD pg_isready -U postgres -h localhost
222
+ STOPSIGNAL SIGINT
223
+ EXPOSE 5432
224
+
225
+ ENV POSTGRES_HOST=/var/run/postgresql
226
+ ENV POSTGRES_USER=supabase_admin
227
+ ENV POSTGRES_DB=postgres
228
+ ENV POSTGRES_INITDB_ARGS="--allow-group-access --locale-provider=icu --encoding=UTF-8 --icu-locale=en_US.UTF-8"
229
+ RUN apt-get update && apt-get install -y --no-install-recommends \
230
+ locales \
231
+ && rm -rf /var/lib/apt/lists/* && \
232
+ localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 \
233
+ && localedef -i C -c -f UTF-8 -A /usr/share/locale/locale.alias C.UTF-8
234
+ RUN echo "C.UTF-8 UTF-8" > /etc/locale.gen && echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && locale-gen
235
+ ENV LANG en_US.UTF-8
236
+ ENV LANGUAGE en_US:en
237
+ ENV LC_ALL en_US.UTF-8
238
+ ENV LC_CTYPE=C.UTF-8
239
+ ENV LC_COLLATE=C.UTF-8
240
+ ENV LOCALE_ARCHIVE /usr/lib/locale/locale-archive
241
+ CMD ["postgres", "-D", "/etc/postgresql"]
0 commit comments