docker部署jar包动态更新,无需重新构建镜像
原本使用docker部署jar包时,将jar包打包成一个镜像进行部署。
最近进行调整,想避免反复制作镜像浪费时间。
大体思路是镜像仅设置java环境以及一些启动参数。
将容器启动时命令指向的jar包目录挂载的宿主机的目录上。
更新jar包时只需要更新宿主机目录下的jar包然后重启容器就可以了。
镜像配置
# 基础镜像使用java
FROM openjdk:8-jre-alpine
#设置字符集
ENV LANG en_US.UTF-8
#启动端口
EXPOSE 8080
#启动命令
ENTRYPOINT ["java","-XX:+UnlockExperimentalVMOptions","-XX:+UseCGroupMemoryLimitForHeap","-jar","-Duser.timezone=Asia/Shanghai","/data/xxxx.jar"]
其中UnlockExperimentalVMOptions
以及UseCGroupMemoryLimitForHeap
是动态指定容器运行是jvm占用的内存大小,仅java8较新的版本才支持。
Duser.timezone=Asia/Shanghai
指定容器运行时区,避免部分jdk的时区设置不一致。
制作镜像
docker build -t 你的镜像名 .
注意最后有个.
启动容器
然后启动时将容器中启动的目录"/data/xxxx.jar"
指向宿主机的物理路径。
docker run -m 800m --name 你的容器名 -it -v /usr/local/project/htserver:/data -d -p 8080:8080你的镜像
限制容器使用内存:-m 800m
,根据实际情况调整。
目录挂载:v /usr/local/project/xxxx:/data
将容器中的/data
挂载到了实际宿主机的目录/usr/local/project/xxxx
下
需要更新jar包时,将jar包直接放在/usr/local/project/xxxx
下,重启容器即可。
推荐一个linux下快速管理文件的镜像filebrowser,可以部署起来,占用内存很小只有10来m,上传、更新服务器上的文件非常方便。
其他问题1
使用alpine的jdk环境部署,缺少字体文件,如果你的项目中某些组件使用了相关的文件,会报错:
java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
解决方法:
在docker构建文件中添加
#安装字体软件,完成字体配置
RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*
重新构建镜像,部署即可。
其他问题2
在某些系统(我是在国产化uos遇到的)中,docker启动时,如果指定的内存稍微大一点儿,启动会报错:
library initialization failed - unable to allocate file descriptor table - out of memoryAborte
解决方法1:
在启动命令后面追加:
#原来的启动命令# --ulimit nofile=65535:65535 --ulimit nproc=65535:65535
出处:https://www.cnblogs.com/exmyth/p/17511915.html
解决方法2:
修改系统设置/etc/systemd/system/docker.service
文件中的 LimitNOFILE、LimitNPROC和LimitCORE配置为65535固定值,原先配置中这三个参数都设置为了infinity导致不起作用:
LimitNOFILE=65535
LimitNPROC=65535
LimitCORE=65535
再次启动即可。
出处:https://blog.csdn.net/aiguoba/article/details/136733979