Jfinal docker化部署

1. 构建jdk基础镜像 Dockerfile

cat > Dockerfile << "XYEOF"
# 第一阶段准备文件,优点: 采用二阶方式以缩小镜像大小 ; 缺点: 多阶打包会产生虚悬镜像,自己删除docker虚悬镜像即可.
FROM centos:7.9.2009 as builder
# 设置工作目录
WORKDIR /xytem

COPY jdk-8u291-linux-x64.tar.gz /xytem/
RUN mkdir -p /usr/local/env
RUN tar -xzf jdk-8u291-linux-x64.tar.gz
RUN mv jdk1.8.0_291 /usr/local/env/jdk
#RUN rm -rf /xytem


# 第二阶段打包
# 指定基础镜像(如果本地没有,会去镜像仓库拉取)
FROM centos:7.9.2009

# 维护者信息
MAINTAINER xy0inue

# 配置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

# 从上一阶段复制已解压并重命名的文件夹到新镜像
COPY --from=builder /usr/local/env/jdk /usr/local/env/jdk

# 配置环境变量
ENV XY_JAVA_HOME=/usr/local/env/jdk
ENV CLASSPATH=.:$XY_JAVA_HOME/lib/dt.jar:$XY_JAVA_HOME/lib/tools.jar
ENV PATH=$XY_JAVA_HOME/bin:$XY_JAVA_HOME/jre/bin:$PATH

XYEOF
docker build -t  xyjdk8:1.0  .


2.  Jfinal 项目修改

(1). 修改启动脚本

注意:docker启动的程序不可以是后台运行的.  这里新建一个docker.sh. 

建议保留原有的jfinal.sh, 1.尊重作者波总. 2.还能支持非docker环境的比如裸部署.

cat > docker.sh << "XYEOF"
#!/bin/bash

# 启动入口类,该脚本文件用于别的项目时要改这里
MAIN_CLASS=com.baidu.xyinue.MainConfig

if [[ "$MAIN_CLASS" == "com.yourpackage.YourMainClass" ]]; then
    echo "请先修改 MAIN_CLASS 的值为你自己项目启动Class,然后再执行此脚本。"
        exit 0
fi

# Java 命令行参数,根据需要开启下面的配置,改成自己需要的,注意等号前后不能有空格
# JAVA_OPTS="-Xms256m -Xmx1024m -Dundertow.port=80 -Dundertow.host=0.0.0.0"
# JAVA_OPTS="-Dundertow.port=80 -Dundertow.host=0.0.0.0"

# 生成 class path 值
APP_BASE_PATH=$(cd `dirname $0`; pwd)
CP=${APP_BASE_PATH}/config:${APP_BASE_PATH}/lib/*


java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS}
XYEOF



chmod +x docker.sh


(2) jfinal项目使用原有的方式正常打包  xyapp.zip

mvn clean package -DskipTests

(3) 打包后的zip, 打成docker镜像.

这里手动解压xyapp.zip  -> xyapp 文件夹. 

因为docker ADD命令支持的tar.gz 不支持zip压缩包. 也可以直接在第二步打包成xyapp.tar.gz格式. 自己随意.

cat > Dockerfile << "XYEOF"
# 指定基础镜像(如果本地没有,会去镜像仓库拉取)
FROM xy_jdk8:1.0

# 维护者信息
MAINTAINER xy0inue

WORKDIR /app/xyapp

ADD xyapp /app/xyapp

ENTRYPOINT ["./docker.sh"]

XYEOF
构建镜像
docker build -t  xyapp:1.0  . --no-cache

(4) 运行docker镜像

docker run -d -p 8505:8505 \
  --name xyapp_hennansheng \
  -v /data/ssd1/xyapptem:/app/xyapp \
  -e XY_ENV_VAR='{"xyaaa": "hennansheng","xyaaa2": "traffic_rw2"}' \
  xyapp:1.0


注: -v /data/ssd1/xyapptem:/app/xyapp

交换空间进行外挂. 交换空间储存了,程序运行的临时文件, 日志...

/data/ssd1/xyapptem 物理机路径,  

/app/xyapp  容器内路径. 


3. 其他

(1) 向程序添加配置参数的方式

[1] 固定不变的还是建议放在conf_pro.txt  

prop = PropKit.use("confxy_pro.txt");
prop.appendIfExists("confxy_dev.txt");

[2] 通过环境变量的方式向程序注入json参数.固定不变的还是建议放在conf.txt

  -e XY_ENV_VAR='{"xyaaa": "hennansheng","xyaaa2": "traffic_rw2"}' \

假如你有一个程序适用并且运行不同城市, 可以使用这种注参的方式. 比如这个 -e XY_ENV_VAR .

[3] 当然如果你的参数很多, 建议仅仅注入一个 项目编号.

然后程序内部访问类似Consul  或者别的http链接进行配置. 比如如下方式.

主要是通过json变成一个map,使用 Prop的addValueFromMap的方式注入参数.

public static void addConfFromUrl(XyProp prop) {
    String s = HttpClientUtil.doGet(prop.get("city_conf_url"));
    String projectCodeThis = prop.get("project_code_this");

    Map hashMap = XyJsonUtil.keyToObj(s, Map.class, projectCodeThis);
    Set<String> strings = hashMap.keySet();

    HashMap<String, String> stringStringHashMap = new HashMap<>();

    for (String string : strings) {
        stringStringHashMap.put(string, hashMap.get(string) + "");
    }

    prop.addValueFromMap(stringStringHashMap);

}


评论区

热门分享

扫码入社