Docker配置java-gdal环境
背景
GDAL(Geospatial Data Abstraction Library)是一个开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。
GDAL使用C++开发,因此要在Java环境下使用GDAL库,要用JNI(Java跨平台调用的一种方式)的方法调用dll库
在服务器部署中,由于编译流程较为复杂且服务器上的依赖库不尽相同,且对不同linux发行版编译过程和语法有细微差别,为了解决快速部署不同服务器环境,因此选择docker制作镜像实现快速迁移
制作流程
- gdal-Dockerfile创建
- java应用jar包依赖
Dockerfile文件
openjdk版本
镜像参考库:github.com/azavea/dock… ,
这里参考配置模板,基于jdk的官方镜像,能满足最小化环境配置要求
模板参数
-
GDAL_VERSION
- gdal要安装的版本,如(3.3.0),这里的版本一定要找对,在download.osgeo.org/gdal ,选择你要编译的版本号
-
OPENJPEG_VERSION
- OPENJPEG版本号 -
VARIANT
-基础的运行容器,理解成精简最小化安装的运行系统,可选alpine或者slim,(alpine基于alpine Linux镜像 打包。alpineLinux镜像的优势在于大小只有5M左右,slim为最小安装包,仅包含运行目标程序的必要工具) -
OPENJDK_VERSION
- 选择要用到的openjdk版本,如:2.3.0,这里是用基础的jdk版本镜像制作的 -
LIBRPOJ_VERSION
- 要安装的pro4j版本,这里主要是适配gdal3x以后的版本,在download.osgeo.org/proj ,选择你要的版本号,如:5.2.0,这里只要数字号,不要全名 -
CORES
- 用于构建库的核心数量, make -j带一个参数,可以把项目在进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源
修改Dockerfile文件
这里由于模板生成的镜像名称过长,这里修改成自己需要的
#修改cibuild文件中的镜像名称
quay.io/azavea/openjdk-gdal ->> gdal3.3-jdk11
把所有脚本文件上传到服务器,目录结构保持不动,选择好版本信息,执行:
#执行前将cibuild创建可执行任务 chmod u+x ./scripts/cibuild
GDAL_VERSION=3.1.2 OPENJDK_VERSION=8 OPENJPEG_VERSION=2.3.0 LIBPROJ_VERSION=7.1.0 CORES=3 VARIANT=slim ./scripts/cibuild
构建完成后可以看到Dockerfile文件已正常生成,images已经正常看到所选的镜像生成成功,可以用docker images 查询
另外在构建过程中,出现了python编译版本失败导致镜像构建不成功的情况,暂时把python编译包注释,有需要的可以自行修改Dockerfile测试
tomcat版本
有了最小化版本的jdk版本镜像,这里我根据自身需要构建了一份基于tomcat的版本直接可部署的镜像容器
- 修改模板基础镜像版本为tomcat,在:hub.docker.com/_/tomcat/ta… ,选择需要的tomcat容器和jdk版本
#这里我选择tomcat9,jdk11
FROM tomcat:9.0.71-jdk11-temurin-focal
- 生成镜像文件,完整的Dockerfile文件如下
#FROM openjdk:%%OPENJDK_VERSION%%
FROM tomcat:9.0.71-jdk11-temurin-focal
ENV ROOTDIR /usr/local
ENV LD_LIBRARY_PATH /usr/local/lib
ENV TOMCAT_PATH /usr/local/tomcat
ENV GDAL_VERSION %%GDAL_VERSION%%
ENV OPENJPEG_VERSION %%OPENJPEG_VERSION%%
ENV LIBPROJ_VERSION %%LIBPROJ_VERSION%%
ENV CORES %%CORES%%
# Load assets
WORKDIR $ROOTDIR/
RUN mkdir -p $ROOTDIR/src
RUN wget -qO- \
https://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 wget -qO- \
https://download.osgeo.org/proj/proj-${LIBPROJ_VERSION}.tar.gz | \
tar -xzC $ROOTDIR/src/
RUN set -ex \
# Runtime dependencies
&& deps=" \
python-dev \
python3-dev \
python-numpy \
python3-numpy \
bash-completion \
libspatialite-dev \
libpq-dev \
libcurl4-gnutls-dev \
libxml2-dev \
libgeos-dev \
libnetcdf-dev \
libpoppler-dev \
libhdf4-alt-dev \
libhdf5-serial-dev \
libpoppler-private-dev \
sqlite3 \
libsqlite3-dev \
libtiff-dev \
" \
# Build dependencies
&& buildDeps=" \
build-essential \
cmake \
swig \
ant \
pkg-config \
"\
&& apt-get update -y && apt-get install -y $buildDeps $deps --no-install-recommends \
# Compile and install OpenJPEG
&& cd src/openjpeg-${OPENJPEG_VERSION} \
&& mkdir build && cd build \
&& cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$ROOTDIR \
&& make -j${CORES} && make -j${CORES} install && make -j${CORES} clean \
&& cd $ROOTDIR && rm -Rf src/openjpeg* \
# Compile and install PROJ
&& cd src/proj-${LIBPROJ_VERSION} && ./configure && make -j${CORES} && make install \
&& cd $ROOTDIR && rm -Rf src/proj* \
# Compile and install GDAL
&& cd src/gdal-${GDAL_VERSION} \
#&& ./configure --with-python --with-spatialite --with-pg --with-curl --with-java=$JAVA_HOME \
&& ./configure --with-spatialite --with-pg --with-curl --with-java=$JAVA_HOME \
--with-poppler --with-openjpeg=$ROOTDIR \
&& make -j${CORES} && make -j${CORES} install && ldconfig \
# Compile Python and Java bindings for GDAL
&& cd $ROOTDIR/src/gdal-${GDAL_VERSION}/swig/java && make -j${CORES} && make -j${CORES} 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
&& apt-get purge -y --auto-remove $buildDeps \
&& rm -rf /var/lib/apt/lists/*
- 运行tomcat容器
#将logs,webapps从容器中映射出来,便于以后部署服务,tomcat9-gdal:3.3-jdk11-slim是你自己指定的版本名称
docker run --name tomcat -d -p 8989:8080 --restart always -v /home/test/gdal3.3-tomcat9-jdk11/logs:/usr/local/tomcat/logs -v /home/test/gdal3.3-tomcat9-jdk11/webapps:/usr/local/tomcat/webapps tomcat9-gdal:3.3-jdk11-slim
扩展版本
如果有其他业务或者自身需求展开制作Dockerfile文件的,可以定制化修改编译模板,核心的编译内容保持不变就可以了
java应用jar包依赖
有了基础的java-gdal环境以后,还需要把相关的gdal的jar包引入,这里可以根据不同版本配套的jar包引入的自身应用中,这里如果想使用对应gdal版本jar包的,可以从下载:www.gisinternals.com/archive.php , 需要的版本,把bin\gdal\java下的gdal.jar包引入到系统工程中。
在引入系统时,注意把gdal.jar打入到项目工程里,我这里采用的是nexus私库导入依赖的形式,因此不再赘述引入工程依赖过程
总结
gdal的环境编译较为复杂,我之前进行了多次系统上编译,大多不成功且编译时间较长,这次采用docker部署就是为了环境便于迁移且不受系统版本影响,如果windows有docker环境的话,也可以直接运行本机docker进行加载镜像,完成一次编译多处运行的效果