PS:一个由线上x64架构却使用arm包引发的全攻血案,超图的iObjects依赖真TM坑爹!
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架构下载!
2)随便创个文件夹,在里面丢入:1、iObjects完整包 2 、全攻Dockerfile 。打包
目录内容如下:
Dockerfile配置如下:
# 超图容器依赖打包 Dockerfile(支持x64 、全攻arm)# 临时镜像,打包用于去掉ADD的大文件层(超图包3个G),最后只保留最终镜像FROM ubuntu:16.04 AS TMP_IMAGEMAINTAINER Yoko# 超图目录&JREENV SUPERMAP /supermapENV SUPERMAP_TMP $SUPERMAP/tmpENV SUPERMAP_SUPPORT $SUPERMAP/SupportENV SUPERMAP_BIN $SUPERMAP/BinENV SUPERMAP_JRE $SUPERMAP/jre# 超图依赖(完整包),需要不同架构的去下载不同的包即可:http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspxADD supermap-iobjectsjava-10.2.1-20428-92245-linux64-all.tar.gz $SUPERMAP_TMPRUN 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=1RUN rm -rf $SUPERMAP_TMP && rm -rf $SUPERMAP_SUPPORT/*.tar# 多端构建模式,去除大文件依赖,也可以使用 docker build -t municipal-app-supermap . --squash 但需要开启docker的experimental功能FROM ubuntu:16.04WORKDIR /ENV SUPERMAP /supermapENV SUPERMAP_TMP $SUPERMAP/tmpENV SUPERMAP_SUPPORT $SUPERMAP/SupportENV SUPERMAP_BIN $SUPERMAP/BinENV SUPERMAP_JRE $SUPERMAP/jreENV 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 install -y tzdata \&& 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 && dpkg-reconfigure -f noninteractive tzdata# 文件目录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/webappCMD echo "环境变量: ${PATH}" \&& echo "加载驱动: $SUPERMAP_SUPPORT" && cd $SUPERMAP_SUPPORT && ./dinst \&& echo "启动app: $APP" && 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; \fi3)打开powershell/shell执行构建,不出意外的话应该不会出意外,等待结束就行了 。
# 构建镜像docker build -t app-supermap .# 导出镜像docker save -o ./app-supermap app-supermap# 载入镜像docker load -i app-supermap0)启动参数说明
-v APP应用目录:/app | 映射APP目录 |
-v 超图/Bin:/supermap/Bin | 超图iObjects的全攻Bin依赖 |
-v 超图证书目录:/opt/SuperMap/License | 超图的证书 |
-p 8888:8888 | 映射的端口 |
-v 文件上传目录:/opt/upFiles | APP本地文件的保存路径 |
Docker启动参数(可选) | |
-e APP_NAME=main.jar | APP的入口jar,默认为main.jar |
-e APP_LIB_PATH=lib | APP所需的依赖目录,默认为jar包同级目录下的 lib 目录,留空则以不分离模式启动 |
-e APP_CONFIG_PATH=config | APP所需的配置目录,默认为jar包同级目录下的 config 目录 |
-e APP_PROFILE_ACTIVE=prod | APP启动时加载的配置文件,默认prod |
-e APP_PORT=8888 | APP启动端口,默认8888 |
-e APP_JVM_OPTION=“” | APP启动时附带的额外JVM参数 |
1)必须要申请超图的证书:https://www.supermapol.com/web/pricing/triallicense
申请完如下:
2)启动示例
APP目录结构长这样:
对应的启动参数长这样:
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-supermap1)ChatGPT
2)https://www.zhihu.com/question/325416061