53 lines
2.6 KiB
Docker
53 lines
2.6 KiB
Docker
# GDAL with ECW (read) support, for decoding Environment Agency Vertical Aerial
|
|
# Photography in the satellite-highres pipeline (pipeline/download/satellite_highres.py).
|
|
#
|
|
# EA VAP ships as ECW **v2** rasters, which are readable by the open-source
|
|
# libecwj2 3.3 SDK -- the same library the official OSGeo image uses when built
|
|
# with WITH_ECW=yes. We therefore avoid the proprietary, login-gated Hexagon
|
|
# ERDAS ECW/JP2 SDK (which is only needed for ECW v3) and its licensing
|
|
# restrictions entirely.
|
|
#
|
|
# We build only the ECW driver as a GDAL *plugin* on top of the official runtime
|
|
# image (no full GDAL rebuild). The plugin's GDAL sources are pinned to the exact
|
|
# commit reported by the base image so libgdal and the plugin stay ABI-compatible.
|
|
#
|
|
# Build: docker build -t perfect-postcode/gdal-ecw:latest docker/gdal-ecw
|
|
# Verify: docker run --rm perfect-postcode/gdal-ecw:latest gdalinfo --formats | grep -i ECW
|
|
|
|
FROM ghcr.io/osgeo/gdal:ubuntu-full-latest
|
|
|
|
ARG LIBECWJ2_URL=https://github.com/rouault/libecwj2-3.3-builds/releases/download/v1/install-libecwj2-3.3-ubuntu-20.04.tar.gz
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
cmake g++ make git curl ca-certificates \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Open-source ECW v2 SDK (extracts to /opt/libecwj2-3.3) + make its libs loadable.
|
|
RUN curl --retry 3 --retry-all-errors --retry-delay 3 -fsSL -o /tmp/libecwj2.tar.gz "$LIBECWJ2_URL" \
|
|
&& tar -C / -xzf /tmp/libecwj2.tar.gz \
|
|
&& rm -f /tmp/libecwj2.tar.gz \
|
|
&& (cd /opt/libecwj2-3.3/lib && for so in *.so*; do \
|
|
ln -sf "/opt/libecwj2-3.3/lib/$so" "/usr/lib/x86_64-linux-gnu/$so"; \
|
|
done) \
|
|
&& ldconfig
|
|
|
|
# Build the ECW driver plugin against the base image's exact GDAL sources.
|
|
RUN set -eux; \
|
|
GDAL_COMMIT="$(gdalinfo --version | sed -nE 's/.*-([0-9a-f]{8,}).*/\1/p')"; \
|
|
test -n "$GDAL_COMMIT"; \
|
|
echo "Building ECW plugin for GDAL commit ${GDAL_COMMIT}"; \
|
|
mkdir -p /tmp/gdal && cd /tmp/gdal && git init -q; \
|
|
git fetch --depth 1 -q https://github.com/OSGeo/gdal.git "$GDAL_COMMIT"; \
|
|
git checkout -q FETCH_HEAD; \
|
|
cmake -S frmts/ecw -B /tmp/ecw-build \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_PREFIX_PATH=/usr \
|
|
-DECW_ROOT=/opt/libecwj2-3.3; \
|
|
cmake --build /tmp/ecw-build -j"$(nproc)"; \
|
|
PLUGIN_DIR=/usr/lib/x86_64-linux-gnu/gdalplugins; \
|
|
mkdir -p "$PLUGIN_DIR"; \
|
|
find /tmp/ecw-build -name 'gdal_ECW*.so' -exec cp {} "$PLUGIN_DIR/" \; ; \
|
|
rm -rf /tmp/gdal /tmp/ecw-build
|
|
|
|
# Fail the build if the driver is not actually available.
|
|
RUN gdalinfo --formats | grep -iq 'ECW.*rw' && echo "ECW driver OK"
|