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); }