首页 > 解决方案 > 将 GDAL 添加到基于 openjdk-alpine 的容器中

问题描述

我有在容器上运行的 Spring Boot 应用程序。它的 Dockerfile 是这样的:

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
CMD ["java", "-jar",  "/app.jar"]

在应用程序中有ogr2ogr命令,所以我想将 GDAL 包安装到容器中。我不知道我怎么能做到这一点。我觉得我在这里最接近解决方案。在这个解决方案中,在 Alpine 的测试分支中,但据我所知proj,现在它在社区分支中。因此,我添加了 proj 的依赖项并修改了 Dockerfile,如下所示:

FROM openjdk:8-jdk-alpine

ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar


ENV ROOTDIR /usr/local
ENV LD_LIBRARY_PATH /usr/local/lib
ENV GDAL_VERSION 3.1.2
ENV OPENJPEG_VERSION 2.3.0

# Load assets
WORKDIR $ROOTDIR/
RUN mkdir -p $ROOTDIR/src

RUN wget -qO- \
    http://download.osgeo.org/gdal/${GDAL_VERSION}/gdal-${GDAL_VERSION}.tar.gz | \
    tar -xzC $ROOTDIR/src/
RUN wget -qO- \
    https://github.com/uclouvain/openjpeg/archive/v${OPENJPEG_VERSION}.tar.gz | \
    tar -xzC $ROOTDIR/src/

RUN set -ex \
    # Install runtime dependencies
    && apk add --update --no-cache \
       git \
       bash-completion \
       python-dev \
       python3-dev \
       libffi-dev \
       jpeg-dev \
       openjpeg-dev \
       libpng-dev \
       linux-headers \
       curl-dev \
       musl \
       libjpeg-turbo \
       libcurl \
       zlib \
       libgcc \
       libstdc++ \
       musl \
       sqlite-libs \
       tiff \
    && apk add --no-cache \
        --repository http://dl-cdn.alpinelinux.org/alpine/edge/community \
        proj \
        proj-dev \
    # Install common build dependencies
    && apk add --no-cache --virtual .build-deps \
       gcc \
       cmake \
       build-base \
       make \
       swig \
       apache-ant \
    # Compile and install OpenJPEG
    && cd src/openjpeg-${OPENJPEG_VERSION} \
    && mkdir build && cd build \
    && cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$ROOTDIR \
    && make -j3 && make -j3 install && make -j3 clean \
    && cd $ROOTDIR && rm -Rf src/openjpeg* \
    # Compile and install GDAL
    && cd src/gdal-${GDAL_VERSION} \
    && ./configure --with-python --with-curl --with-java=${JAVA_HOME} --with-openjpeg=$ROOTDIR \
    && make -j3 && make -j3 install \
    # Compile Python and Java bindings for GDAL
    && cd $ROOTDIR/src/gdal-${GDAL_VERSION}/swig/java && make -j3 && make -j3 install \
    && cd $ROOTDIR/src/gdal-${GDAL_VERSION}/swig/python \
    && python3 setup.py build \
    && python3 setup.py install \
    && cd $ROOTDIR && rm -Rf src/gdal* \
    # Remove build dependencies
    && apk del .build-deps \


CMD ["java", "-jar", "/app.jar"]

然后的输出docker build是:

15 176.1 checking for ld used by GCC... /usr/x86_64-alpine-linux-musl/bin/ld -m elf_x86_64
#15 176.1 checking if the linker (/usr/x86_64-alpine-linux-musl/bin/ld -m elf_x86_64) is GNU ld... yes
#15 176.1 checking for shared library run path origin... /bin/sh: can't open './config.rpath': No such file or directory
#15 176.1 done
#15 176.1 checking for iconv... yes
#15 176.2 checking for working iconv... yes
#15 176.2 checking for iconv declaration...
#15 176.2          extern size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
#15 176.3 using ICONV_CPP_CONST=""
#15 176.3 configure: Bash completions not requested
#15 176.3 checking for PROJ >= 6 library... checking for proj_create_from_wkt in -lproj... no
#15 176.3 checking for internal_proj_create_from_wkt in -lproj... no
#15 176.4 checking for internal_proj_create_from_wkt in -linternalproj... no
#15 176.4 configure: error: PROJ 6 symbols not found
------
executor failed running [/bin/sh -c set -ex     && apk add --update --no-cache        git        bash-completion        python-dev        python3-dev        libffi-dev        jpeg-dev        openjpeg-dev
 libpng-dev        linux-headers        curl-dev        musl        libjpeg-turbo        libcurl        zlib        libgcc        libstdc++        musl        sqlite-libs        tiff     && apk add --no-cache
       --repository http://dl-cdn.alpinelinux.org/alpine/edge/community         proj         proj-dev     && apk add --no-cache --virtual .build-deps        gcc        cmake        build-base        make
 swig        apache-ant     && cd src/openjpeg-${OPENJPEG_VERSION}     && mkdir build && cd build     && cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$ROOTDIR     && make -j3 && make -j3 install &
& make -j3 clean     && cd $ROOTDIR && rm -Rf src/openjpeg*     && cd src/gdal-${GDAL_VERSION}     && ./configure --with-python --with-curl --with-java=${JAVA_HOME} --with-openjpeg=$ROOTDIR     && make -j3 && m
ake -j3 install     && cd $ROOTDIR/src/gdal-${GDAL_VERSION}/swig/java && make -j3 && make -j3 install     && cd $ROOTDIR/src/gdal-${GDAL_VERSION}/swig/python     && python3 setup.py build     && python3 setup.p
y install     && cd $ROOTDIR && rm -Rf src/gdal*     && apk del .build-deps CMD ["java", "-jar", "-Dlogging.config=/logback.xml", "/app.jar"]]: exit code: 1

让我强调一下,我不了解 Alpine Linux 和 GDAL。我试图根据我找到的解决方案做一些事情。

标签: javadockerdockerfilegdalalpine

解决方案


推荐阅读