离线环境 Docker Jar包启动空指针异常处理
问题现象
FROM openjdk:8-jdk-alpine
MAINTAINER WinJayX@Gmail.com
LABEL description="This is Java Project"
LABEL version="1.1"
USER root
COPY ./*.jar /Lit_Algorithm.jar
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# RUN apk add --update ttf-dejavu fontconfig && fc-cache --force && echo "Asia/Shanghai" > /etc/timezone
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /Lit_Algorithm.jar
打包后启动镜像,容器报空指针异常,也看不出来是哪里的问题。
测试排查
随后使用IDE进行启动,测试访问接口数据返回正常。没有报错。
直接打出Jar包放到Linux服务器上运行,服务也是正常,没有报错。
java -jar algorithm_serv.jar --server.port=8080 --spring.profiles.active=prod
只要将Jar包放到Docker中就报错,但是我们的测试环境也是Docker跑着的,那个服务是正常的呢。
问题解决
冷静思考后,觉得应该是Docker基础镜像的问题,但是与测试环境的区别也就是Dockerfile中注释的RUN apk add --update ttf-dejavu fontconfig && fc-cache --force && echo "Asia/Shanghai" > /etc/timezone
的条命令,为啥要注释掉呢,是因为客户那边儿的系统都是离线的,没有外网的,这不想着尽可能模拟客户现场的网络情况,结果出问题了。
为了验证一下,我这边儿开启这条注释重新修改后
FROM openjdk:8-jdk-alpine
MAINTAINER WinJayX@Gmail.com
LABEL description="This is Java Project"
LABEL version="1.1"
USER root
COPY ./*.jar /Lit_Algorithm.jar
ADD https://litsoft.oss-cn-beijing.aliyuncs.com/OpsTool/Alpine-Zone-Shanghai /etc/localtime
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add --update ttf-dejavu fontconfig && fc-cache --force && echo "Asia/Shanghai" > /etc/timezone
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /Lit_Algorithm.jar
重新打包Docker镜像并启动后,结果成了。。没有报错了。
后续构建个客户方用的JDK基础镜像,方便以后升级后端服务使用。
FROM openjdk:8-jdk-alpine
MAINTAINER WinJayX@Gmail.com
LABEL description="This is JDK Project"
LABEL version="1.1"
USER root
ADD https://litsoft.oss-cn-beijing.aliyuncs.com/OpsTool/Alpine-Zone-Shanghai /etc/localtime
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add --update ttf-dejavu fontconfig && fc-cache --force && echo "Asia/Shanghai" > /etc/timezone
然后将这个镜像导出放到客户端服务器上即可。
评论区