docker 构建gdal-java镜像(含tomcat)

在centos中安装gdal3.x是比较麻烦的,所以可以准备一个编译镜像,将gdal在镜像内部编译,再每次打其他包的时候从中复制编译好的gdal即可.

编译镜像:

FROM adoptopenjdk/openjdk8:x86_64-centos-jdk8u312-b07

WORKDIR /src

# 下载源码
RUN curl https://www.sqlite.org/2021/sqlite-autoconf-3350400.tar.gz -o sqlite.tar.gz && \
    tar -xzf sqlite.tar.gz && rm -rf sqlite.tar.gz && \
    curl https://download.osgeo.org/proj/proj-8.0.0.tar.gz -o proj.tar.gz && \
    tar -xzf proj.tar.gz && rm -rf proj.tar.gz && \
    curl -L https://github.com/OSGeo/gdal/releases/download/v3.2.2/gdal-3.2.2.tar.gz -o gdal.tar.gz && \
    tar -xzf gdal.tar.gz && rm -rf gdal.tar.gz

# 安装编译依赖
RUN yum -y install gcc gcc-c++ kernel-devel swig ant \
    libcurl-devel flex bison autoconf automake \
    bzip-devel zlib-devel ncurses-devel libjpeg-devel \
    libpng-devel libtiff-devel freetype-devel pam-devel \
    python3 python-devel python3-devel openssl-devel libtool \
    libxml2-devel gettext-devel pcre-devel && yum clean all
    
RUN cd sqlite-autoconf-3350400 && \
    # 编译sqlite
    CFLAGS="-DSQLITE_ENABLE_COLUMN_METADATA=1" \
    ./configure --prefix=/usr/local && \
    make -j$(nproc) && make install DESTDIR="/build" && \
    export SQLITE3_CFLAGS="-I/build/usr/local/include" && \
    export SQLITE3_LIBS="-L/build/usr/local/lib -lsqlite3" && \
    export PATH=/build/usr/local/bin/:$PATH && \
    cd ../proj-8.0.0 && \
    # 编译proj
    CFLAGS='-DPROJ_RENAME_SYMBOLS -O2' \
    CXXFLAGS='-DPROJ_RENAME_SYMBOLS -DPROJ_INTERNAL_CPP_NAMESPACE -O2' \
    ./configure --prefix=/usr/local --disable-static && \
    make -j$(nproc) && make install DESTDIR="/build" && \
    cd ../gdal-3.2.2 && \
    # 编译gdal
    ./configure --prefix=/usr \
    --without-libtool \
    --with-hide-internal-symbols \
    --with-jpeg12 \
    --with-python=/usr/bin/python3 \
    --with-webp \
    --with-proj=/build/usr/local \
    --with-libtiff=internal \
    --with-rename-internal-libtiff-symbols \
    --with-geotiff=internal \
    --with-rename-internal-libgeotiff-symbols \
    --with-java=/opt/java/openjdk \
    --with-jvm-lib=/opt/java/openjdk/jre/lib/amd64/server \
    --with-jvm-lib-add-rpath && \
    make -j$(nproc) && \
    make install DESTDIR="/build" && \
    # 编译GDAL for java
    cd swig/java && \
    make -j$(nproc) && \
    make install DESTDIR="/build"

# 安装python库,如果不需要python 可删除以下内容
RUN pip3 install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple cython && \
    export PROJ_DIR=/build/usr/local && \
    pip3 install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple pyproj==2.2.0 && \
    pip3 uninstall -y cython 

RUN PROJ_SO=$(readlink /build/usr/local/lib/libproj.so | sed "s/libproj\.so\.//") \
    && PROJ_SO_FIRST=$(echo $PROJ_SO | awk 'BEGIN {FS="."} {print $1}') \
    && mv /build/usr/local/lib/libproj.so.${PROJ_SO} /build/usr/local/lib/libinternalproj.so.${PROJ_SO} \
    && ln -s libinternalproj.so.${PROJ_SO} /build/usr/local/lib/libinternalproj.so.${PROJ_SO_FIRST} \
    && ln -s libinternalproj.so.${PROJ_SO} /build/usr/local/lib/libinternalproj.so \
    && rm -rf /build/usr/local/lib/libproj.*  \
    && ln -s libinternalproj.so.${PROJ_SO} /build/usr/local/lib/libproj.so.${PROJ_SO_FIRST} \
    && strip -s /build/usr/local/lib/libinternalproj.so.${PROJ_SO} \
    && for i in /build/usr/local/bin/*; do strip -s $i 2>/dev/null || /bin/true; done \
    && 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/lib64/python*          /build_gdal_python/usr/lib \
    && rsync -av /usr/local/lib64/python*   /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/python3.6/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

编译镜像

docker build -t gdal_centos .

使用编译好的镜像,构建新镜像的Dockerfile

FROM adoptopenjdk/openjdk8:x86_64-centos-jdk8u312-b07

COPY --from=gdal_centos  /build/usr/local/share/proj/ /usr/local/share/proj/
COPY --from=gdal_centos  /build/usr/local/include/ /usr/local/include/
COPY --from=gdal_centos  /build/usr/local/bin/ /usr/local/bin/
COPY --from=gdal_centos  /build/usr/local/lib/ /usr/local/lib/

# gdal 相关的库编译好后在 /usr下非/usr/local下因此需要复制/usr下的库
COPY --from=gdal_centos  /build/usr/include/ /usr/local/include/
COPY --from=gdal_centos  /build/usr/bin/ /usr/local/bin/
COPY --from=gdal_centos  /build/usr/lib/ /usr/local/lib/


COPY --from=gdal_centos  /build/usr/share/java /usr/share/java
COPY --from=gdal_centos  /build/usr/share/gdal/ /usr/share/gdal/
COPY --from=gdal_centos  /build/usr/include/ /usr/include/
# 如果不使用python删除下面两行
COPY --from=gdal_centos  /build_gdal_python/usr/ /usr/
COPY --from=gdal_centos  /build_gdal_version_changing/usr/ /usr/

ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/lib

RUN ln -s /usr/lib/libgdal.so.3 /usr/lib/libgdal.so.26 && \
    ln -s /usr/lib/libgdal.so.3 /usr/lib/libgdal.so.27 && \
    ln -s /usr/lib/libgdal.so.3 /usr/lib/libgdal.so.28 && \
    yum -y install libjpeg-devel libtiff-devel

构建含有tomcat的镜像

FROM adoptopenjdk/openjdk8:x86_64-centos-jdk8u312-b07
MAINTAINER jetlee
ENV REFRESHED_AT 2023-08-30
#切换镜像目录,进入/usr目录
WORKDIR /opt
#在/usr/下创建tomcat目录,用来存放tomcat
RUN mkdir tomcat
#将宿主机的tomcat目录下的文件拷至镜像的/usr/tomcat目录下
ADD apache-tomcat-8.5.93 /opt/tomcat/

COPY --from=gdal_centos  /build/usr/local/share/proj/ /usr/local/share/proj/
COPY --from=gdal_centos  /build/usr/local/include/ /usr/local/include/
COPY --from=gdal_centos  /build/usr/local/bin/ /usr/local/bin/
COPY --from=gdal_centos  /build/usr/local/lib/ /usr/local/lib/
COPY --from=gdal_centos  /build/usr/lib/ /usr/local/lib/
COPY --from=gdal_centos  /build/usr/bin/ /usr/local/bin/
COPY --from=gdal_centos  /build/usr/include/ /usr/local/include/

COPY --from=gdal_centos  /build/usr/share/java /usr/share/java
COPY --from=gdal_centos  /build/usr/share/gdal/ /usr/share/gdal/
COPY --from=gdal_centos  /build/usr/include/ /usr/include/


ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/lib

RUN ln -s /usr/lib/libgdal.so.3 /usr/lib/libgdal.so.26 && \
    ln -s /usr/lib/libgdal.so.3 /usr/lib/libgdal.so.27 && \
    ln -s /usr/lib/libgdal.so.3 /usr/lib/libgdal.so.28 && \
    yum -y install libjpeg-devel libtiff-devel

# 引入中文字符集

RUN yum reinstall -y glibc-common && \
    yum install -y telnet net-tools && \
    yum clean all && \
    rm -rf /tmp/* rm -rf /var/cache/yum/* && \
    localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
 
ENV LANG=zh_CN.UTF-8 \
    LANGUAGE=zh_CN:zh \
    LC_ALL=zh_CN.UTF-8



RUN ldconfig
ENV GDAL_DATA=/usr/local/lib
#设置环境变量
ENV JAVA_HOME=/opt/java/openjdk
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH=/sbin:$JAVA_HOME/bin:$PATH:/usr/local/lib


 
#公开端口
EXPOSE 8080
#设置启动命令
ENTRYPOINT ["/opt/tomcat/bin/catalina.sh","run"]

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值