Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
376 lines (349 sloc) 14.4 KB
##
# osgeo/gdal:alpine-normal
# This file is available at the option of the licensee under:
# Public domain
# or licensed under X/MIT (LICENSE.TXT) Copyright 2019 Even Rouault <even.rouault@spatialys.com>
FROM alpine:latest as builder
# Derived from osgeo/proj by Howard Butler <howard@hobu.co>
MAINTAINER Even Rouault <even.rouault@spatialys.com>
# Setup build env for PROJ
RUN apk add --no-cache wget curl unzip -q make libtool autoconf automake pkgconfig g++ sqlite sqlite-dev
ARG PROJ_DATUMGRID_LATEST_LAST_MODIFIED
RUN \
mkdir -p /build_projgrids/usr/share/proj \
&& curl -LOs http://download.osgeo.org/proj/proj-datumgrid-latest.zip \
&& unzip -q -j -u -o proj-datumgrid-latest.zip -d /build_projgrids/usr/share/proj \
&& rm -f *.zip
# For GDAL
ARG POPPLER_DEV=poppler-dev
RUN apk add --no-cache \
linux-headers \
curl-dev \
zlib-dev zstd-dev \
libjpeg-turbo-dev libpng-dev openjpeg-dev libwebp-dev expat-dev \
py-numpy-dev python2-dev py2-numpy \
${POPPLER_DEV} postgresql-dev \
# For spatialite (and GDAL)
libxml2-dev \
&& mkdir -p /build_thirdparty/usr/lib
# Build xerces-c
ARG XERCESC_VERSION=3.2.2
RUN if test "${XERCESC_VERSION}" != ""; then ( \
wget -q http://mirror.ibcp.fr/pub/apache/xerces/c/3/sources/xerces-c-${XERCESC_VERSION}.zip \
&& unzip -q xerces-c-${XERCESC_VERSION}.zip \
&& rm -f xerces-c-${XERCESC_VERSION}.zip \
&& cd xerces-c-${XERCESC_VERSION} \
&& ./configure --prefix=/usr --disable-static \
&& make -j$(nproc) \
&& make install \
&& cp -P /usr/lib/libxerces-c*.so* /build_thirdparty/usr/lib \
&& for i in /build_thirdparty/usr/lib/*; do strip -s $i 2>/dev/null || /bin/true; done \
&& cd .. \
&& rm -rf xerces-c-${XERCESC_VERSION} \
); fi
# Build geos
ARG GEOS_VERSION=3.7.1
RUN if test "${GEOS_VERSION}" != ""; then ( \
wget -q http://download.osgeo.org/geos/geos-${GEOS_VERSION}.tar.bz2 \
&& tar xjf geos-${GEOS_VERSION}.tar.bz2 \
&& rm -f geos-${GEOS_VERSION}.tar.bz2 \
&& cd geos-${GEOS_VERSION} \
&& ./configure --prefix=/usr --disable-static \
&& make -j$(nproc) \
&& make install \
&& cp -P /usr/lib/libgeos*.so* /build_thirdparty/usr/lib \
&& for i in /build_thirdparty/usr/lib/*; do strip -s $i 2>/dev/null || /bin/true; done \
&& cd .. \
&& rm -rf geos-${GEOS_VERSION} \
); fi
# Build szip
ARG SZIP_VERSION=2.1.1
RUN if test "${SZIP_VERSION}" != ""; then ( \
wget -q https://support.hdfgroup.org/ftp/lib-external/szip/${SZIP_VERSION}/src/szip-${SZIP_VERSION}.tar.gz \
&& tar xzf szip-${SZIP_VERSION}.tar.gz \
&& rm -f szip-${SZIP_VERSION}.tar.gz \
&& cd szip-${SZIP_VERSION} \
&& CFLAGS=-O2 ./configure --prefix=/usr --disable-static \
&& make -j$(nproc) \
&& make install \
&& cp -P /usr/lib/libsz*.so* /build_thirdparty/usr/lib \
&& for i in /build_thirdparty/usr/lib/*; do strip -s $i 2>/dev/null || /bin/true; done \
&& cd .. \
&& rm -rf szip-${SZIP_VERSION} \
); fi
# Build hdf5
ARG HDF5_VERSION=1.10.5
RUN if test "${HDF5_VERSION}" != ""; then ( \
wget -q https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-${HDF5_VERSION%.*}/hdf5-${HDF5_VERSION}/src/hdf5-${HDF5_VERSION}.tar.gz \
&& tar xzf hdf5-${HDF5_VERSION}.tar.gz \
&& rm -f hdf5-${HDF5_VERSION}.tar.gz \
&& cd hdf5-${HDF5_VERSION} \
&& CFLAGS=-O2 CXXFLAGS=-O2 ./configure --prefix=/usr --disable-static --with-szlib=/usr --enable-cxx \
&& make -j$(nproc) \
&& make install \
&& cp -P /usr/lib/libhdf5*.so* /build_thirdparty/usr/lib \
&& for i in /build_thirdparty/usr/lib/*; do strip -s $i 2>/dev/null || /bin/true; done \
&& cd .. \
&& rm -rf hdf5-${HDF5_VERSION} \
); fi
# Build netCDF
ARG NETCDF_VERSION=4.6.3
RUN if test "${NETCDF_VERSION}" != ""; then ( \
wget -q https://github.com/Unidata/netcdf-c/archive/v${NETCDF_VERSION}.tar.gz \
&& tar xzf v${NETCDF_VERSION}.tar.gz \
&& rm -f v${NETCDF_VERSION}.tar.gz \
&& cd netcdf-c-${NETCDF_VERSION} \
&& CFLAGS=-O2 ./configure --prefix=/usr --disable-static \
&& make -j$(nproc) \
&& make install \
&& cp -P /usr/lib/libnetcdf*.so* /build_thirdparty/usr/lib \
&& for i in /build_thirdparty/usr/lib/*; do strip -s $i 2>/dev/null || /bin/true; done \
&& cd .. \
&& rm -rf netcdf-c-${NETCDF_VERSION} \
); fi
# Build hdf4
ARG HDF4_VERSION=4.2.14
RUN if test "${HDF4_VERSION}" != ""; then ( \
apk add --no-cache byacc flex portablexdr-dev \
&& mkdir hdf4 \
&& wget -q https://support.hdfgroup.org/ftp/HDF/releases/HDF${HDF4_VERSION}/src/hdf-${HDF4_VERSION}.tar.gz -O - \
| tar xz -C hdf4 --strip-components=1 \
&& cd hdf4 \
&& LDFLAGS=-lportablexdr ./configure --prefix=/usr --enable-shared --disable-static \
--with-szlib=/usr --disable-fortran --disable-netcdf \
&& make -j$(nproc) \
&& make install \
&& cp -P /usr/lib/libdf*.so* /build_thirdparty/usr/lib \
&& cp -P /usr/lib/libmfhdf*.so* /build_thirdparty/usr/lib \
&& for i in /build_thirdparty/usr/lib/*; do strip -s $i 2>/dev/null || /bin/true; done \
&& cd .. \
&& rm -rf hdf4 \
&& apk del byacc flex portablexdr-dev \
); fi
# Build freexl
ARG FREEXL_VERSION=1.0.5
RUN if test "${FREEXL_VERSION}" != ""; then ( \
wget -q http://www.gaia-gis.it/gaia-sins/freexl-${FREEXL_VERSION}.tar.gz \
&& tar xzf freexl-${FREEXL_VERSION}.tar.gz \
&& rm -f freexl-${FREEXL_VERSION}.tar.gz \
&& cd freexl-${FREEXL_VERSION} \
&& ./configure --prefix=/usr --disable-static \
&& make -j$(nproc) \
&& make install \
&& cp -P /usr/lib/libfreexl*.so* /build_thirdparty/usr/lib \
&& for i in /build_thirdparty/usr/lib/*; do strip -s $i 2>/dev/null || /bin/true; done \
&& cd .. \
&& rm -rf freexl-${FREEXL_VERSION} \
); fi
# Build likbkea
ARG KEA_VERSION=c6d36f3db5e4
RUN if test "${KEA_VERSION}" != ""; then ( \
apk add --no-cache cmake \
&& wget -q https://bitbucket.org/chchrsc/kealib/get/${KEA_VERSION}.zip \
&& unzip -q ${KEA_VERSION}.zip \
&& rm -f ${KEA_VERSION}.zip \
&& cd chchrsc-kealib-${KEA_VERSION}/trunk \
&& cmake . -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr -DHDF5_INCLUDE_DIR=/usr/include/hdf5 \
-DHDF5_LIB_PATH=/usr/lib -DLIBKEA_WITH_GDAL=OFF \
&& make -j$(nproc) \
&& make install \
&& cd ../.. \
&& rm -rf chchrsc-kealib-${KEA_VERSION} \
&& cp -P /usr/lib/libkea*.so* /build_thirdparty/usr/lib \
&& for i in /build_thirdparty/usr/lib/*; do strip -s $i 2>/dev/null || /bin/true; done \
&& apk del cmake \
); fi
RUN apk add --no-cache rsync ccache
ARG RSYNC_REMOTE
# Build PROJ
ARG PROJ_VERSION=master
RUN mkdir proj \
&& wget -q https://github.com/OSGeo/proj.4/archive/${PROJ_VERSION}.tar.gz -O - \
| tar xz -C proj --strip-components=1 \
&& cd proj \
&& ./autogen.sh \
&& if test "${RSYNC_REMOTE}" != ""; then \
echo "Downloading cache..."; \
rsync -ra ${RSYNC_REMOTE}/proj/ $HOME/; \
echo "Finished"; \
export CC="ccache gcc"; \
export CXX="ccache g++"; \
export PROJ_DB_CACHE_DIR="$HOME/.ccache"; \
ccache -M 100M; \
fi \
&& ./configure --prefix=/usr --disable-static --enable-lto \
&& make -j$(nproc) \
&& make install \
&& make install DESTDIR="/build_proj" \
&& if test "${RSYNC_REMOTE}" != ""; then \
ccache -s; \
echo "Uploading cache..."; \
rsync -ra --delete $HOME/.ccache ${RSYNC_REMOTE}/proj/; \
echo "Finished"; \
rm -rf $HOME/.ccache; \
unset CC; \
unset CXX; \
fi \
&& cd .. \
&& rm -rf proj \
&& for i in /build_proj/usr/lib/*; do strip -s $i 2>/dev/null || /bin/true; done \
&& for i in /build_proj/usr/bin/*; do strip -s $i 2>/dev/null || /bin/true; done
# Build spatialite
ARG SPATIALITE_VERSION=4.3.0a
RUN if test "${SPATIALITE_VERSION}" != ""; then ( \
wget -q http://www.gaia-gis.it/gaia-sins/libspatialite-${SPATIALITE_VERSION}.tar.gz \
&& tar xzf libspatialite-${SPATIALITE_VERSION}.tar.gz \
&& rm -f libspatialite-${SPATIALITE_VERSION}.tar.gz \
&& cd libspatialite-${SPATIALITE_VERSION} \
&& if test "${RSYNC_REMOTE}" != ""; then \
echo "Downloading cache..."; \
rsync -ra ${RSYNC_REMOTE}/spatialite/ $HOME/; \
echo "Finished"; \
export CC="ccache gcc"; \
export CXX="ccache g++"; \
ccache -M 100M; \
fi \
&& CFLAGS="-DACCEPT_USE_OF_DEPRECATED_PROJ_API_H -O2" ./configure --prefix=/usr --disable-static \
&& make -j$(nproc) \
&& make install \
&& if test "${RSYNC_REMOTE}" != ""; then \
ccache -s; \
echo "Uploading cache..."; \
rsync -ra --delete $HOME/.ccache ${RSYNC_REMOTE}/spatialite/; \
echo "Finished"; \
rm -rf $HOME/.ccache; \
unset CC; \
unset CXX; \
fi \
&& mkdir -p /build_spatialite/usr/lib \
&& cp -P /usr/lib/libspatialite*.so* /build_spatialite/usr/lib \
&& for i in /build_spatialite/usr/lib/*; do strip -s $i 2>/dev/null || /bin/true; done \
&& cd .. \
&& rm -rf libspatialite-${SPATIALITE_VERSION} \
); else \
mkdir -p /build_spatialite/usr/lib; \
fi
# Build GDAL
ARG GDAL_VERSION=master
ARG GDAL_RELEASE_DATE
ARG GDAL_BUILD_IS_RELEASE
RUN if test "${GDAL_VERSION}" = "master"; then \
export GDAL_VERSION=$(curl -Ls https://api.github.com/repos/OSGeo/gdal/commits/HEAD -H "Accept: application/vnd.github.VERSION.sha"); \
export GDAL_RELEASE_DATE=$(date "+%Y%m%d"); \
fi \
&& if test "x${GDAL_BUILD_IS_RELEASE}" = "x"; then \
export GDAL_SHA1SUM=${GDAL_VERSION}; \
fi \
&& export GDAL_EXTRA_ARGS="" \
&& if test "${GEOS_VERSION}" != ""; then \
export GDAL_EXTRA_ARGS="--with-geos ${GDAL_EXTRA_ARGS}"; \
fi \
&& if test "${XERCESC_VERSION}" != ""; then \
export GDAL_EXTRA_ARGS="--with-xerces ${GDAL_EXTRA_ARGS}"; \
fi \
&& if test "${HDF4_VERSION}" != ""; then \
apk add --no-cache portablexdr-dev \
&& export LDFLAGS="-lportablexdr ${LDFLAGS}" \
&& export GDAL_EXTRA_ARGS="--with-hdf4 ${GDAL_EXTRA_ARGS}"; \
fi \
&& if test "${HDF5_VERSION}" != ""; then \
export GDAL_EXTRA_ARGS="--with-hdf5 ${GDAL_EXTRA_ARGS}"; \
fi \
&& if test "${NETCDF_VERSION}" != ""; then \
export GDAL_EXTRA_ARGS="--with-netcdf ${GDAL_EXTRA_ARGS}"; \
fi \
&& if test "${SPATIALITE_VERSION}" != ""; then \
export GDAL_EXTRA_ARGS="--with-spatialite ${GDAL_EXTRA_ARGS}"; \
fi \
&& if test "${POPPLER_DEV}" != ""; then \
export GDAL_EXTRA_ARGS="--with-poppler ${GDAL_EXTRA_ARGS}"; \
fi \
&& echo ${GDAL_EXTRA_ARGS} \
&& mkdir gdal \
&& wget -q https://github.com/OSGeo/gdal/archive/${GDAL_VERSION}.tar.gz -O - \
| tar xz -C gdal --strip-components=1 \
&& cd gdal/gdal \
&& if test "${RSYNC_REMOTE}" != ""; then \
echo "Downloading cache..."; \
rsync -ra ${RSYNC_REMOTE}/gdal/ $HOME/; \
echo "Finished"; \
# Little trick to avoid issues with Python bindings
printf "#!/bin/sh\nccache gcc \$*" > ccache_gcc.sh; \
chmod +x ccache_gcc.sh; \
printf "#!/bin/sh\nccache g++ \$*" > ccache_g++.sh; \
chmod +x ccache_g++.sh; \
export CC=$PWD/ccache_gcc.sh; \
export CXX=$PWD/ccache_g++.sh; \
ccache -M 1G; \
fi \
&& ./configure --prefix=/usr --without-libtool \
--with-hide-internal-symbols \
--with-proj=/usr \
--with-libtiff=internal --with-rename-internal-libtiff-symbols \
--with-geotiff=internal --with-rename-internal-libgeotiff-symbols \
# --enable-lto
${GDAL_EXTRA_ARGS} \
--with-python \
&& make -j$(nproc) \
&& make install DESTDIR="/build" \
&& if test "${RSYNC_REMOTE}" != ""; then \
ccache -s; \
echo "Uploading cache..."; \
rsync -ra --delete $HOME/.ccache ${RSYNC_REMOTE}/gdal/; \
echo "Finished"; \
rm -rf $HOME/.ccache; \
unset CC; \
unset CXX; \
fi \
&& cd ../.. \
&& rm -rf gdal \
&& mkdir -p /build_gdal_python/usr/lib \
&& mkdir -p /build_gdal_python/usr/bin \
&& mkdir -p /build_gdal_version_changing/usr/include \
&& mv /build/usr/lib/python2.7 /build_gdal_python/usr/lib \
&& mv /build/usr/lib /build_gdal_version_changing/usr \
&& mv /build/usr/include/gdal_version.h /build_gdal_version_changing/usr/include \
&& mv /build/usr/bin/*.py /build_gdal_python/usr/bin \
&& mv /build/usr/bin /build_gdal_version_changing/usr \
&& for i in /build_gdal_version_changing/usr/lib/*; do strip -s $i 2>/dev/null || /bin/true; done \
&& for i in /build_gdal_python/usr/lib/python2.7/site-packages/osgeo/*.so; do strip -s $i 2>/dev/null || /bin/true; done \
&& for i in /build_gdal_version_changing/usr/bin/*; do strip -s $i 2>/dev/null || /bin/true; done \
# Remove resource files of uncompiled drivers
&& (for i in \
# unused
/build/usr/share/gdal/*.svg \
# unused
/build/usr/share/gdal/*.png \
;do rm $i; done)
# Build final image
FROM alpine:latest as runner
RUN date
ARG POPPLER=poppler
RUN apk add --no-cache \
libstdc++ \
sqlite-libs \
libcurl \
zlib zstd-libs\
libjpeg-turbo libpng openjpeg libwebp expat \
python2 py2-numpy ${POPPLER} pcre libpq libxml2 portablexdr \
# libturbojpeg.so is not used by GDAL. Only libjpeg.so*
&& rm -f /usr/lib/libturbojpeg.so* \
# libpoppler-cpp.so is not used by GDAL. Only libpoppler.so*
&& rm -f /usr/lib/libpoppler-cpp.so* \
# Only libwebp.so is used by GDAL
&& rm -f /usr/lib/libwebpmux.so* /usr/lib/libwebpdemux.so* /usr/lib/libwebpdecoder.so* \
# Remove .py files since we have already the .pyc
&& find /usr/lib/python2.7/site-packages -name "*.py" -exec rm {} \;
# Order layers starting with less frequently varying ones
COPY --from=builder /build_thirdparty/usr/ /usr/
COPY --from=builder /build_projgrids/usr/ /usr/
COPY --from=builder /build_spatialite/usr/ /usr/
COPY --from=builder /build_proj/usr/share/proj/ /usr/share/proj/
COPY --from=builder /build_proj/usr/include/ /usr/include/
COPY --from=builder /build_proj/usr/bin/ /usr/bin/
COPY --from=builder /build_proj/usr/lib/ /usr/lib/
COPY --from=builder /build/usr/share/gdal/ /usr/share/gdal/
COPY --from=builder /build/usr/include/ /usr/include/
COPY --from=builder /build_gdal_python/usr/ /usr/
COPY --from=builder /build_gdal_version_changing/usr/ /usr/
You can’t perform that action at this time.