SuperMap iObjects Docker打包全攻略

news2024/12/24 9:02:40

SuperMap iObjects Docker打包全攻略

文章目录

    • SuperMap iObjects Docker打包全攻略
      • 说明
      • 开始打包iObjects容器
      • 启动容器
      • 参考

说明

  1. 此教程编写时使用的iObjects版本为 10.2.1 ,理论高版本同样支持,具体自测。
  2. 基础镜像为 Docker 官方 ubuntu:16.04完整版。(想换alpine自己折腾)
  3. 不同CPU架构都需要重新打包Dockerfile以安装相关LIB库(本教程以x64为例)
  4. 容器内部默认使用超图iObjects完整包内自带的JRE(10.2.1是1.8),因此如果由高版本JRE需求的请自己研究。
  5. 切记构建容器时,使用的是超图官方下载的iObjects完整包
  6. 构建后的容器默认以 Spring Boot 分离式打包启动,有需要的话参考这里。
  7. 容器构建中使用了多段构建模式,为了减少ADD层3个G的超图包大小,因此部分指令略显冗余。
  8. 在打包时排除$SUPERMAP/Bin,以减少镜像体积,后续通过目录映射提供。
  9. 此教程最终打包后的容器大小在 600M,算是可接受范围。

PS:一个由线上x64架构却使用arm包引发的血案,超图的iObjects依赖真TM坑爹!

开始打包iObjects容器

1)准备Docker环境,版本务必 > 17.05;超图 iObjects 版本 > 10.2.1。

Docker下载:https://www.docker.com/products/docker-desktop

iObjects下载:http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx

切记不要只下载Bin包!要下的完整包也就是绿色版!根据实际的CPU架构下载!

image-20230424094846896

2)随便创个文件夹,在里面丢入:1、iObjects完整包 2、Dockerfile

目录内容如下:

image-20230424101245650

Dockerfile配置如下:

# 超图容器依赖打包 Dockerfile(支持x64、arm)
# 临时镜像,用于去掉ADD的大文件层(超图包3个G),最后只保留最终镜像
FROM ubuntu:16.04 AS TMP_IMAGE
MAINTAINER Yoko

# 超图目录&JRE
ENV SUPERMAP /supermap
ENV SUPERMAP_TMP $SUPERMAP/tmp
ENV SUPERMAP_SUPPORT $SUPERMAP/Support
ENV SUPERMAP_BIN $SUPERMAP/Bin
ENV SUPERMAP_JRE $SUPERMAP/jre
# 超图依赖(完整包),需要不同架构的去下载不同的包即可:http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx
ADD supermap-iobjectsjava-10.2.1-20428-92245-linux64-all.tar.gz $SUPERMAP_TMP
RUN mv $SUPERMAP_TMP/jre* $SUPERMAP_JRE && mv $SUPERMAP_TMP/Support $SUPERMAP_SUPPORT
# RUN mv $SUPERMAP_TMP/Bin $SUPERMAP_BIN # 是否需要Bin内嵌看自己
RUN tar -xvf $SUPERMAP_SUPPORT/aksusbd* -C $SUPERMAP_SUPPORT --strip-components=1
RUN rm -rf $SUPERMAP_TMP && rm -rf $SUPERMAP_SUPPORT/*.tar

# 多端构建模式,去除大文件依赖,也可以使用 docker build -t municipal-app-supermap . --squash 但需要开启docker的experimental功能
FROM ubuntu:16.04
WORKDIR /
ENV SUPERMAP /supermap
ENV SUPERMAP_TMP $SUPERMAP/tmp
ENV SUPERMAP_SUPPORT $SUPERMAP/Support
ENV SUPERMAP_BIN $SUPERMAP/Bin
ENV SUPERMAP_JRE $SUPERMAP/jre
ENV JAVA_HOME $SUPERMAP_JRE

# 直接复制临时镜像内部文件
COPY --from=TMP_IMAGE $SUPERMAP $SUPERMAP

# 更换阿里源,依次安装相关依赖库(超图包缺失的)
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
    && sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
    && apt-get clean && apt-get update \
    && apt-get install -y libgomp1 \
    && apt-get install -y libx11-dev \
    && apt-get install -y libxext-dev \
    && apt-get install -y libxrender-dev \
    && apt-get install -y libxtst-dev \
    && apt-get install -y libxinerama-dev \
    && apt-get install -y libxrandr-dev \
    && apt-get autoclean \
    && apt-get autoremove -y \
    && rm -rf /var/cache/apt/* \
    && rm -rf /var/lib/apt/lists/*

# 时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 文件目录
RUN mkdir -p /opt/upFiles && mkdir -p /opt/webapp

# 设置字符集(防止应用日志乱码)
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
# 动态链接库
ENV LD_LIBRARY_PATH $SUPERMAP_BIN:$LD_LIBRARY_PATH
# 环境变量,超图的必须在最前面
ENV PATH $SUPERMAP_BIN:$JAVA_HOME/bin:$PATH
# 应用目录
ENV APP /app
# 应用入口
ENV APP_NAME=main.jar
# 依赖文件夹,设置为空时,不以配置分离式启动
ENV APP_LIB_PATH=lib APP_CONFIG_PATH=config
# 配置启用配置文件
ENV APP_PROFILE_ACTIVE=prod APP_PORT=8888
# 特殊JVM参数
ENV APP_JVM_OPTION="-Djava.security.egd=file:/dev/./urandom -Xms2048m -Xmx2048m"

# 暴露端口
EXPOSE $APP_PORT/tcp
# 应用-入口文件夹(必须)
VOLUME $APP
# 超图-依赖目录(必须)
VOLUME $SUPERMAP_BIN
# 超图-证书目录(必须)
VOLUME /opt/SuperMap/License
# 应用-本地文件上传目录(建议)
VOLUME /opt/upFiles
# 应用-本地webapp目录(可选)
VOLUME /opt/webapp

CMD echo "环境变量: ${PATH}" \
    && echo "加载驱动: $SUPERMAP_SUPPORT" && cd $SUPERMAP_SUPPORT && ./dinst \
    && echo "启动app: $(pwd)" && cd $APP && ls . -al \
    && if [ -n "$APP_LIB_PATH" ] && [ -n "$APP_CONFIG_PATH" ]; then \
           java $APP_JVM_OPTION \
                     -Dloader.path=$APP_LIB_PATH,$APP_CONFIG_PATH \
                     -Dspring.profiles.active=$APP_PROFILE_ACTIVE \
                     -Dserver.port=$APP_PORT \
                     -jar $APP_NAME; \
       else \
           java $APP_JVM_OPTION \
                    -Dspring.profiles.active=$APP_PROFILE_ACTIVE \
                    -Dserver.port=$APP_PORT \
                    -jar $APP_NAME; \
       fi

3)打开powershell/shell执行构建,不出意外的话应该不会出意外,等待结束就行了。

# 构建镜像
docker build -t app-supermap .
# 导出镜像
docker save -o ./app-supermap app-supermap
# 载入镜像
docker load -i app-supermap

启动容器

0)启动参数说明

Docker启动参数(必需)说明
-v APP应用目录:/app映射APP目录
-v 超图/Bin:/supermap/Bin超图iObjects的Bin依赖
-v 超图证书目录:/opt/SuperMap/License超图的证书
-p 8888:8888映射的端口
-v 文件上传目录:/opt/upFilesAPP本地文件的保存路径
Docker启动参数(可选)
-e APP_NAME=main.jarAPP的入口jar,默认为main.jar
-e APP_LIB_PATH=libAPP所需的依赖目录,默认为jar包同级目录下的 lib 目录,留空则以不分离模式启动
-e APP_CONFIG_PATH=configAPP所需的配置目录,默认为jar包同级目录下的 config 目录
-e APP_PROFILE_ACTIVE=prodAPP启动时加载的配置文件,默认prod
-e APP_PORT=8888APP启动端口,默认8888
-e APP_JVM_OPTION=“”APP启动时附带的额外JVM参数

1)必须要申请超图的证书:https://www.supermapol.com/web/pricing/triallicense

申请完如下:

image-20230424101446868

2)启动示例

APP目录结构长这样:

image-20230424102801128

对应的启动参数长这样:

docker run -di \
    -p 8888:8888 \
    -v /home/app:/app \
    -v /home/upFiles:/opt/upFiles \
    -v /home/supermap/Bin:/supermap/Bin \
    -v /opt/SuperMap/License:/opt/SuperMap/License 
    --restart=unless-stopped \
    --name app app-supermap

如果是未分离打包的JAR,把APP_LIB_PATH或者APP_CONFIG_PATH置空:

docker run -di \
    -p 8888:8888 \
    -v /home/app:/app \
    -v /home/upFiles:/opt/upFiles \
    -v /home/supermap/Bin:/supermap/Bin \
    -v /opt/SuperMap/License:/opt/SuperMap/License \
    -e APP_LIB_PATH="" \
    --restart=unless-stopped \
    --name app app-supermap

参考

1)ChatGPT

2)https://www.zhihu.com/question/325416061

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 类和对象(中)构造函数 和 析构函数

上篇链接:C 类和对象(上)_chihiro1122的博客-CSDN博客 类的6个默认成员函数 我们在C当中,在写一些函数的时候,比如在栈的例子: 如上述例子,用C 返回这个栈是否为空,直接返回的话&am…

基于OpenCV-python的图像增强和滤波

目录 彩色空间 直方图均衡化 图像滤波 梯度 一、彩色空间 OpenCV 的颜色空间主要有 BGR、HSV、Lab等,cvtColor 函数可以让图像在不同颜色空间转换。例如通过将花的图像转换到 HSV 颜色空间,在HSV空间内过滤出只含有花瓣颜色的像素,从而提…

公共资源包发布流程详解

文章目录 公有包发布并使用npm安装git仓库协议创建及使用 npm 私有包创建及使用 group npm 私有包私有仓账密存放位置 当公司各个系统都需要使用特定的业务模块时,这时候将代码抽离,发布到 npm 上,供下载安装使用,是个比较好的方案…

SQL Server基础 第七章 连接查询(内连接、表别名、左外连接、右外连接)

前言 连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。前面章节的查询均是基于单表进行,但有时需要获取的信息存储于多张表中,此时就必须使用本章所介绍的多表连接查询技术来获取…

关于debug一晚上的一些思考,做开发到底要养成什么习惯?

总结:日志一定要写,日志一定要写,日志一定要写! 今天晚上是我学开发过程中很不一样的一晚,今晚学到了很多。 虽然我也只是一个开发的初学小白,今天的debug分享是我的一个小方法和一个小记录,如…

第四章——数学知识2

欧拉函数 欧拉函数表示的是1-n中与n互质数的个数。 如1-6中:1,5都和6互质,因此互质数为2 欧拉函数分解质因数后表示为: 互质数个数可表示为 int main() {int n;cin >> n;while(n--){int a;cin >> a;//分解质因数int r…

TypeScript自学笔记

目录 1.什么是Ts? 1.1 设计公司:微软 1.2 TS概述 1.3 TS是静态类型 JS是动态类型 1.4 TS是强类型语言 JS是弱类型语言 2.TypeScript编译器 2.1 安装 2.2 TS自动编译和编译选项设置 3.TS的数据类型 3.1 基础数据类型number、string、boolean 3.2 Arrays&a…

大数据架构(二)大数据发展史

1.传统数仓发展史 传统数据仓库的发展史这里不展开架构细讲,只需快速过一遍即可。了解这个历史发展过程即可。 1.1 传统数仓历史 1.1.1 5个时代 传统数仓发展史可以称为5个时代的经典论证战。按照两位数据仓库大师 Ralph kilmball、Bill Innmon 在数据仓库建设理念上…

吃透Redis面试八股文

Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis 的数据是存在内存中的&#xf…

Python Review 01

1、Anaconda Installation 使用Anaconda Navigator进行python环境管理,使用conda进行依赖管理。 2、Use of Jupyter 将代码写入一个个cell,代码文件由一个个cell组成,书写代码时就像一行一行在写笔记,这就是notebook的代码编辑环…

无宿主机权限情况下,获取pod的日志文件

如果没有宿主机权限,是无法访问宿主机及里边的文件的,但是如果想获取某些文件,如日志等如何操作呢? 整体思路:通过抓包工具,抓取websocket的的信息,然后把信息处理拼接后导出即可。 1、启动抓包工具 我这里使用的是charles抓包工具 2、打开对应pod的命令行窗口 3、抓…

基于灰度图像和小波图的双模态卷积神经网络在心血管疾病分类中的应用

目录 一、研究对象和ECG记录预处理 二、机器学习和LSTM 三、将一维ECG记录转换为二维图像 四、双模态CNN模型 五、性能评估 参考文献 一、研究对象和ECG记录预处理 本研究采用Chapman大学和Shaoxing人民医院(浙江大学医学院绍兴医院)收集的12导联…

领导力专题︱如何培养与提升领导力

本文内容结构 一、领导力的核心技能 1、完美领导者? 2、认识你的组织需要什么 3、不同层面领导力共有的特征和技能 4、你的个人行为准则 5、领导风格 6、创造个人影响力 7、完善自己的领导网络 二、领导力与领导者 1、领导力与组织环境 2、领导者还是管理…

2023/4/23总结

项目: 做出了个人信息界面,通过点击头像的方式: 然后就是点击头像可以选择文件(后面考虑是存储该文件到自己的文件夹还是只是加载该文件比较好)只是能选择文件,写了指定文件后缀名的代码但是好像没什么用…

如何将Edge插件迁移至Google?

问题描述: 因为无法访问谷歌,无法从谷歌插件市场下载插件 第一步:在电脑上找到插件地址 高亮部分:自己电脑上的用户名【不同用户可能会有所不同】 C:\Users\star-dream\AppData\Local\Microsoft\Edge\User Data\Default\Extensi…

rust的现状和未来发展

rust现状: Stack Overflow 的开发者调研显示只有 7% 的开发者在使用 Rust,对比 JavaScript、Python 等语言,使用 Rust 的开发者占比并不高;但从 2016 年开始,Rust 每年都是开发者最爱的编程语言。 根据 JetBrains 2021 年的调研报…

SSH远程访问及控制

文章目录 1.SSH远程管理1.1 SSH的概述1.2 OpenSSH服务器1.3 sshd_ config常用选项设置1.4 SSH端口、配置文件 2.配置OpenSSH服务端2.1 更改端口号2.2 用户登录控制 3.登录验证方式3.1 密码验证3.2 密钥对验证3.3 配置密钥对验证 5.TCP Wrappers访问控制5.1 TCPWrappers机制的基…

第37讲:Python if-elif-else流程控制语句核心概念以及案例演示

文章目录 1.流程控制的概念2.Python中代码块的相关注意事项3.if流程控制语句的语法格式4.if流程控制的简单使用4.1.单分支的if流程控制语句4.2.加else语句的if流程控制4.3.多分支的if流程控制4.4.多分支if代码优化 5.对象的布尔值6.if-else条件表达式6.1.if-else条件表达式语法…

String的那些事儿

String作为我们最常用的Java类之一,在日常开发过程中充当着重要角色?那么大家真的了解String吗?让我们一起看看下面的问题: String内存结构?对象存储在堆上还是栈上?一个String有多长?占内存多…

享元设计模式解读

目录 问题引进 展示网站项目需求 传统方案解决网站展现项目 传统方案解决网站展现项目-问题分析 享元模式基本介绍 基本介绍 享元模式的原理类图 对类图的说明 内部状态和外部状态 享元模式解决网站展现项目 应用实例要求 思路分析和图解(类图) 代码实现 享元模式…