Java 应用容器化规范

注意:适用于 ACP v3.14.3、v3.16.2、v3.18 及以上版本。

仅当 Java 应用使用 JAVA_TOOL_OPTIONS 环境变量时,必须遵循以下容器化规范,以确保应用自身配置的 JAVA_TOOL_OPTIONS 环境变量生效。具体来说,在容器平台部署时,应用的 Deployment 应显式声明 JAVA_TOOL_OPTIONS 环境变量。示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-java-app
spec:
  template:
    spec:
      containers:
        - env: # 配置示例
            - name: JAVA_TOOL_OPTIONS
              value: "-Xmx1024m -Xms512m"
          name: your-java-app

原因:当 Java 应用(Deployment)作为服务添加到平台(OpenTelemetry治理)时,Java Agent 会自动注入,通过在 pod 的 JAVA_TOOL_OPTIONS 环境变量中追加 -javaagent 参数,例如 -javaagent:/otel-auto-instrumentation-java/javaagent.jar。如果以其他方式配置了 JAVA_TOOL_OPTIONS,可能会被覆盖。

Java 应用容器化规范(旧版)

注意:适用于除上述新版规范外的 ACP 版本。

为确保平台的治理能力能够有效作用于您的 Java 应用,请在开发和构建过程中遵循以下 Java 应用容器化规范:

基础镜像选择

建议使用 JDK 8u212 及以上版本作为基础镜像。

Dockerfile 模板

请参考本文档提供的 Dockerfile 模板及说明,修改 Java 应用项目中使用的 Dockerfile 文件。

Dockerfile 模板如下:

FROM eclipse-temurin:8-alpine

VOLUME /tmp

# 设置容器时区并添加 admin 管理账户,同时创建其家目录。
# 注意:设置时区的指令可能因基础镜像操作系统不同而有所差异。
# 注意:此步骤需要联网下载依赖包,若处于隔离内网环境,请考虑使用公共基础镜像完成此步骤。
RUN apk update \
    && apk add --no-cache tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && adduser -D admin

# WORKDIR 指令方便后续指令使用相对路径,简化脚本编写。
WORKDIR /home/admin/

# 出于安全考虑,使用非 root 账户避免执行 apt-get 等命令。
USER admin

# COPY --chown 选项避免再次执行 chown。
# 注意:确保 start.sh 具有可执行权限。
COPY --chown=admin:admin start.sh \
     target/app.jar \
     /home/admin/

# 通过执行脚本启动容器。
ENTRYPOINT ["./start.sh"]

Dockerfile 模板中引用的 start.sh 脚本内容如下,请将脚本文件与 Dockerfile 保存在同一目录。

#!/bin/sh

# -e 遇到命令返回非零状态时立即退出。
# -x 执行命令时打印命令及其参数。
set -ex

# 使用 JAVA_OPTS 环境变量的值作为 JAVA 服务的启动参数,运行时自动替换为当前环境的 JAVA_OPTS 环境变量值。
# 使用 exec 使 Java 程序能接收到 SIGTERM 信号。
exec /usr/bin/java ${JAVA_OPTS} \
     -Djava.security.egd=file:/dev/./urandom \
     -jar /home/admin/app.jar ${RUN_ARGS} "$@"