Skip to content

Commit e05ff91

Browse files
WarpSQL: Add support for multiple PostGIS versions and optimize build process
1. Implement ARGs for POSTGIS_VERSION and POSTGIS_SHA256 to support different PostGIS versions 2. Conditionally set environment variables GEOS_ALPINE_VER, GDAL_ALPINE_VER, and PROJ_ALPINE_VER based on the selected PostGIS version 3. Add Alpine repositories for required packages when using PostGIS 2.x 4. Streamline the build process by combining RUN instructions 5. Update COPY instructions for initdb-postgis.sh and update-postgis.sh
1 parent ab497cf commit e05ff91

1 file changed

Lines changed: 229 additions & 0 deletions

File tree

Dockerfile

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,235 @@ RUN set -ex \
133133
&& apk del .citus-deps .citus-build-deps
134134

135135

136+
ARG POSTGIS_VERSION
137+
ARG POSTGIS_SHA256
138+
139+
RUN set -eux \
140+
\
141+
&& if [ $(printf %.1s "$POSTGIS_VERSION") == 3 ]; then \
142+
set -eux ; \
143+
export GEOS_ALPINE_VER=3.11 ; \
144+
export GDAL_ALPINE_VER=3.5 ; \
145+
export PROJ_ALPINE_VER=9.1 ; \
146+
elif [ $(printf %.1s "$POSTGIS_VERSION") == 2 ]; then \
147+
set -eux ; \
148+
export GEOS_ALPINE_VER=3.8 ; \
149+
export GDAL_ALPINE_VER=3.2 ; \
150+
export PROJ_ALPINE_VER=7.2 ; \
151+
\
152+
echo 'https://dl-cdn.alpinelinux.org/alpine/v3.14/main' >> /etc/apk/repositories ; \
153+
echo 'https://dl-cdn.alpinelinux.org/alpine/v3.14/community' >> /etc/apk/repositories ; \
154+
echo 'https://dl-cdn.alpinelinux.org/alpine/v3.13/main' >> /etc/apk/repositories ; \
155+
echo 'https://dl-cdn.alpinelinux.org/alpine/v3.13/community' >> /etc/apk/repositories ; \
156+
\
157+
else \
158+
set -eux ; \
159+
echo ".... unknown \$POSTGIS_VERSION ...." ; \
160+
exit 1 ; \
161+
fi \
162+
\
163+
&& apk add --no-cache --virtual .fetch-deps \
164+
ca-certificates \
165+
openssl \
166+
tar \
167+
\
168+
&& wget -O postgis.tar.gz "https://github.com/postgis/postgis/archive/${POSTGIS_VERSION}.tar.gz" \
169+
&& echo "${POSTGIS_SHA256} *postgis.tar.gz" | sha256sum -c - \
170+
&& mkdir -p /usr/src/postgis \
171+
&& tar \
172+
--extract \
173+
--file postgis.tar.gz \
174+
--directory /usr/src/postgis \
175+
--strip-components 1 \
176+
&& rm postgis.tar.gz \
177+
\
178+
&& apk add --no-cache --virtual .build-deps \
179+
\
180+
gdal-dev~=${GDAL_ALPINE_VER} \
181+
geos-dev~=${GEOS_ALPINE_VER} \
182+
proj-dev~=${PROJ_ALPINE_VER} \
183+
\
184+
autoconf \
185+
automake \
186+
clang-dev \
187+
cunit-dev \
188+
file \
189+
g++ \
190+
gcc \
191+
gettext-dev \
192+
git \
193+
json-c-dev \
194+
libtool \
195+
libxml2-dev \
196+
llvm-dev \
197+
make \
198+
pcre-dev \
199+
perl \
200+
protobuf-c-dev \
201+
\
202+
# build PostGIS
203+
\
204+
&& cd /usr/src/postgis \
205+
&& gettextize \
206+
&& ./autogen.sh \
207+
&& ./configure \
208+
--with-pcredir="$(pcre-config --prefix)" \
209+
&& make -j$(nproc) \
210+
&& make install \
211+
\
212+
# add .postgis-rundeps
213+
&& apk add --no-cache --virtual .postgis-rundeps \
214+
\
215+
gdal~=${GDAL_ALPINE_VER} \
216+
geos~=${GEOS_ALPINE_VER} \
217+
proj~=${PROJ_ALPINE_VER} \
218+
\
219+
json-c \
220+
libstdc++ \
221+
pcre \
222+
protobuf-c \
223+
\
224+
ca-certificates \
225+
# clean
226+
&& cd / \
227+
&& rm -rf /usr/src/postgis \
228+
&& apk del .fetch-deps .build-deps
229+
230+
ARG PG_VERSION
231+
ARG PREV_IMAGE
232+
ARG TS_VERSION
233+
############################
234+
# Build tools binaries in separate image
235+
############################
236+
ARG GO_VERSION=1.18.7
237+
FROM golang:${GO_VERSION}-alpine AS tools
238+
239+
ENV TOOLS_VERSION 0.8.1
240+
241+
RUN apk update && apk add --no-cache git gcc musl-dev \
242+
&& go install github.com/timescale/timescaledb-tune/cmd/timescaledb-tune@latest \
243+
&& go install github.com/timescale/timescaledb-parallel-copy/cmd/timescaledb-parallel-copy@latest
244+
245+
############################
246+
# Grab old versions from previous version
247+
############################
248+
ARG PG_VERSION
249+
ARG PREV_IMAGE
250+
FROM ${PREV_IMAGE} AS oldversions
251+
# Remove update files, mock files, and all but the last 5 .so/.sql files
252+
RUN rm -f $(pg_config --sharedir)/extension/timescaledb*mock*.sql \
253+
&& if [ -f $(pg_config --pkglibdir)/timescaledb-tsl-1*.so ]; then rm -f $(ls -1 $(pg_config --pkglibdir)/timescaledb-tsl-1*.so | head -n -5); fi \
254+
&& if [ -f $(pg_config --pkglibdir)/timescaledb-1*.so ]; then rm -f $(ls -1 $(pg_config --pkglibdir)/timescaledb-*.so | head -n -5); fi \
255+
&& if [ -f $(pg_config --sharedir)/extension/timescaledb--1*.sql ]; then rm -f $(ls -1 $(pg_config --sharedir)/extension/timescaledb--1*.sql | head -n -5); fi
256+
257+
############################
258+
# Now build image and copy in tools
259+
############################
260+
ARG PG_VERSION
261+
FROM postgres:${PG_VERSION}-alpine
262+
ARG OSS_ONLY
263+
264+
LABEL maintainer="Timescale https://www.timescale.com"
265+
266+
COPY docker-entrypoint-initdb.d/* /docker-entrypoint-initdb.d/
267+
COPY --from=tools /go/bin/* /usr/local/bin/
268+
COPY --from=oldversions /usr/local/lib/postgresql/timescaledb-*.so /usr/local/lib/postgresql/
269+
COPY --from=oldversions /usr/local/share/postgresql/extension/timescaledb--*.sql /usr/local/share/postgresql/extension/
270+
271+
ARG TS_VERSION
272+
RUN set -ex \
273+
&& apk add libssl1.1 \
274+
&& apk add --no-cache --virtual .fetch-deps \
275+
ca-certificates \
276+
git \
277+
openssl \
278+
openssl-dev \
279+
tar \
280+
&& mkdir -p /build/ \
281+
&& git clone https://github.com/timescale/timescaledb /build/timescaledb \
282+
\
283+
&& apk add --no-cache --virtual .build-deps \
284+
coreutils \
285+
dpkg-dev dpkg \
286+
gcc \
287+
krb5-dev \
288+
libc-dev \
289+
make \
290+
cmake \
291+
util-linux-dev \
292+
\
293+
# Build current version \
294+
&& cd /build/timescaledb && rm -fr build \
295+
&& git checkout ${TS_VERSION} \
296+
&& ./bootstrap -DCMAKE_BUILD_TYPE=RelWithDebInfo -DREGRESS_CHECKS=OFF -DTAP_CHECKS=OFF -DGENERATE_DOWNGRADE_SCRIPT=ON -DWARNINGS_AS_ERRORS=OFF -DPROJECT_INSTALL_METHOD="docker"${OSS_ONLY} \
297+
&& cd build && make install \
298+
&& cd ~ \
299+
\
300+
&& if [ "${OSS_ONLY}" != "" ]; then rm -f $(pg_config --pkglibdir)/timescaledb-tsl-*.so; fi \
301+
&& apk del .fetch-deps .build-deps \
302+
&& rm -rf /build \
303+
&& sed -r -i "s/[#]*\s*(shared_preload_libraries)\s*=\s*'(.*)'/\1 = 'timescaledb,\2'/;s/,'/'/" /usr/local/share/postgresql/postgresql.conf.sample
304+
305+
# Update to shared_preload_libraries
306+
RUN echo "shared_preload_libraries = 'citus,timescaledb,pg_stat_statements'" >> /usr/local/share/postgresql/postgresql.conf.sample
307+
308+
# Adding PG Vector
309+
310+
RUN cd /tmp
311+
RUN apk add --no-cache --virtual .build-deps \
312+
coreutils \
313+
dpkg-dev dpkg \
314+
gcc \
315+
git \
316+
krb5-dev \
317+
libc-dev \
318+
llvm15 \
319+
clang \
320+
make \
321+
cmake \
322+
util-linux-dev \
323+
&& git clone --branch v0.4.1 https://github.com/pgvector/pgvector.git \
324+
&& cd /pgvector \
325+
&& ls \
326+
&& make \
327+
&& make install
328+
329+
## Adding Citus
330+
331+
# Install Citus dependencies
332+
RUN apk add --no-cache --virtual .citus-deps \
333+
curl \
334+
jq
335+
336+
# Install Citus
337+
ARG CITUS_VERSION
338+
RUN set -ex \
339+
&& apk add --no-cache --virtual .citus-build-deps \
340+
gcc \
341+
libc-dev \
342+
make \
343+
curl-dev \
344+
lz4-dev \
345+
zstd-dev \
346+
clang \
347+
krb5-dev \
348+
icu-dev \
349+
libxslt-dev \
350+
libxml2-dev \
351+
llvm15-dev \
352+
&& CITUS_DOWNLOAD_URL="https://github.com/citusdata/citus/archive/refs/tags/v${CITUS_VERSION}.tar.gz" \
353+
&& curl -L -o /tmp/citus.tar.gz "${CITUS_DOWNLOAD_URL}" \
354+
&& tar -C /tmp -xvf /tmp/citus.tar.gz \
355+
&& chown -R postgres:postgres /tmp/citus-${CITUS_VERSION} \
356+
&& cd /tmp/citus-${CITUS_VERSION} \
357+
&& PATH="/usr/local/pgsql/bin:$PATH" ./configure \
358+
&& make \
359+
&& make install \
360+
&& cd ~ \
361+
&& rm -rf /tmp/citus.tar.gz /tmp/citus-${CITUS_VERSION} \
362+
&& apk del .citus-deps .citus-build-deps
363+
364+
136365
ARG POSTGIS_VERSION
137366
ARG POSTGIS_SHA256
138367

0 commit comments

Comments
 (0)