如何在 容器中 优雅的 运行 java 应用

当需要运行Java应用时,不管在机器上还是容器里,一般的做法是运行 java 命令。
java -jar /opt/app.jar 即可
如果是多多jar 文件的只需用到java -cp lib/* com.example.Main 定类路径(classpath)和入口 Java 类即可。
但 在构建容器镜像时,一般使用 Dockerfile 的 ENTRYPOINT 来指定运行的 java 命令。ENTRYPOINT [ "java", "-jar", "/opt/app.jar" ]

直接使用 java 命令的做法,在容器运行时并不灵活。如果想使用 -D 参数来添加新的系统属性,就必须要修改 Dockerfile 中的ENTRYPOINT 定义。这就意味要创建新的镜像,使用起来非常的不方便。

使用 run-java.sh 在容器中 启动Java

脚本地址 run-java.sh

基本用法 (readme.md)

第一类与Java应用相关。

JAVA_APP_DIR 设置应用文件的根目录,默认为 run-java.sh 所在的目录。

JAVA_APP_NAME 设置应用进程的名称。

JAVA_MAJOR_VERSION 设置 JVM 的版本号。默认从 java -version 命令的输出中解析。

第二类与 Java 应用的 classpath 相关。

JAVA_CLASSPATH 设置完整的 classpath。

JAVA_LIB_DIR 设置作为库的 JAR 文件的目录。默认为 JAVA_APP_DIR 的值。

JAVA_APP_JAR 设置可执行的 JAR 文件的路径。

JAVA_MAIN_CLASS 设置入口类的名称。

第三类与Java运行的参数相关。

JAVA_OPTIONS 设置额外的参数。

第四类与运行的内存和 CPU 相关。

JAVA_INIT_MEM_RATIO 设置起始的 heap 尺寸占全部内存的比例。转换成参数 -Xms。值 20 表示 20%。

JAVA_MAX_MEM_RATIO 设置最大的 heap 尺寸占全部内存的比例。转换成参数 -Xmx。值 50 表示 50%。

JAVA_MAX_CORE 设置最大的 CPU 核数。

第五类与调试相关。

JAVA_DEBUG 启用远程调试。

JAVA_DEBUG_SUSPEND 以暂停模式启用远程调试。

JAVA_DEBUG_PORT 设置远程调试的端口。默认为 5005。

第六类与 HTTP 代理相关。

HTTP_PROXY 设置 HTTP 代理。转换成 Java 的系统属性 http.proxyHost 和 http.proxyPort。

HTTPS_PROXY 设置 HTTPS 代理。转换成 Java 的系统属性 https.proxyHost 和 https.proxyPort。

NO_PROXY 设置不使用代理的主机名。转换成 Java 的系统属性 http.nonProxyHosts。

最后一类与应用诊断相关。

JAVA_DIAGNOSTICS 启用输出额外的诊断信息。

举例

就拿 国内 比较火的 开源BI dataease 举例
Dockerfile

FROM registry.cn-qingdao.aliyuncs.com/dataease/fabric8-java-alpine-openjdk8-jre:edge-chromium-11

ARG IMAGE_TAG

RUN mkdir -p /opt/apps /opt/dataease/data/feature/full /opt/dataease/drivers

ADD mapFiles/* /opt/dataease/data/feature/full/

ADD drivers/* /opt/dataease/drivers/

ADD backend/target/backend-$IMAGE_TAG.jar /opt/apps

ENV JAVA_APP_JAR=/opt/apps/backend-$IMAGE_TAG.jar

ENV AB_OFF=true

ENV JAVA_OPTIONS=-Dfile.encoding=utf-8

HEALTHCHECK --interval=15s --timeout=5s --retries=20 --start-period=30s CMD curl -f 127.0.0.1:8081

CMD ["/deployments/run-java.sh"]

定义环境变量

JAVA_APP_DIR=/deployments
JAVA_MAJOR_VERSION=11
JAVA_OPTIONS=-Dfile.encoding=utf-8 
JAVA_APP_JAR=/opt/apps/backend-1.18.9.jar

容器内启动命令为

java -Dfile.encoding=utf-8
-Xmx2048m
-XX:MaxPermSize=1024m
-Xss5m
-XX:+UseParallelGC
-XX:GCTimeRatio=4
-XX:AdaptiveSizePolicyWeight=90
-XX:MinHeapFreeRatio=20
-XX:MaxHeapFreeRatio=40
-XX:+ExitOnOutOfMemoryError
-cp . -jar /opt/apps/backend-1.18.9.jar

你可能感兴趣的:(服务容器化,java,开发语言,容器,docker,jvm)