版本大小阐明
openjdk:8u312-jdk-slim-bullseye132.76 MB
openjdk:8u312-jre-slim71.13 MB
openjdk:8u312-jre-slim-buster66.5 MB版本最高,体积适中;
openjdk:8u312-jre-slim-bullseye71.13 MB
openjdk:8u312-jre-bullseye112.5 MB
openjdk:8u312-oraclelinux8153.76 MB
openjdk:8u171-jdk-alpine3.766.71 MB
openjdk:8u212-jre-alpine3.955.02 MB镜像最小,然而不是基于主线代码的,不反对openJDK的发行版;只反对晚期的OPenJDK的版本
fabric8/java-alpine-openjdk8-jre:1.9.068.3 MB内置了jvm和prometheus的监控客户端;

demo后端工程

application.java

package com.example.demospringboot;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class DemoSpringbootApplication {    public static void main(String[] args) {        SpringApplication.run(DemoSpringbootApplication.class, args);    }}

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.6.2</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <groupId>com.example</groupId>    <artifactId>demo-springboot</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>demo-springboot</name>    <description>demo-springboot</description>    <properties>        <java.version>1.8</java.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies>    <build>        <finalName>demo</finalName>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>

打进去的jar包 demo.jar 18.7M;

不同的镜像制作和运行比照

openjdk:8u312-jre-slim-buster

FROM openjdk:8u312-jre-slim-busterWORKDIR /data/cycube/COPY target/demo.jar /data/cycube/EXPOSE 8080ENV APP_PORT=8080ENV TZ=Asia/ShanghaiENV JAVA_OPTS="-Xms512m -Xmx1024m -Xss256k -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+UseCGroupMemoryLimitForHeap -XX:+HeapDumpOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom"ENV EXT_ARG="-Dserver.port=8080 -Dspring.cloud.nacos.config.enabled=false -Dspring.cloud.nacos.discovery.server-addr=svc-nacos:8848 -Dspring.cloud.nacos.discovery.namespace=public"RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneENTRYPOINT java  $JAVA_OPTS $EXT_ARG -Dserver.port=$APP_PORT -jar /data/cycube/demo.jar

制作指令:

cd demo-springbootdocker build -t demo:v1 -f Dockerfile ./

大小: 207M ;

运行成果:

docker run --name demo1 -p 8081:8080 -d demo:v1

日志:

外部过程状况: ps , telnet,ping curl wget 都没有装置;

openjdk:8u212-jre-alpine3.9

FROM openjdk:8u212-jre-alpine3.9WORKDIR /data/cycube/COPY target/demo.jar /data/cycube/EXPOSE 8080ENV APP_PORT=8080ENV TZ=Asia/ShanghaiENV JAVA_OPTS="-Xms512m -Xmx1024m -Xss256k -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+UseCGroupMemoryLimitForHeap -XX:+HeapDumpOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom"ENV EXT_ARG="-Dserver.port=8080 -Dspring.cloud.nacos.config.enabled=false -Dspring.cloud.nacos.discovery.server-addr=svc-nacos:8848 -Dspring.cloud.nacos.discovery.namespace=public"RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneENTRYPOINT java  $JAVA_OPTS $EXT_ARG -Dserver.port=$APP_PORT -jar /data/cycube/demo.jar

docker build -t demo2:v1 -f Dockerfile2 ./

大小是: 105M

运行成果:

日志:

外部:

反对常见的排查网络指令。

fabric8/java-alpine-openjdk8-jre:1.9.0

FROM fabric8/java-alpine-openjdk8-jre:1.9.0WORKDIR /data/cycube/COPY target/demo.jar /data/cycube/EXPOSE 8080ENV APP_PORT=8080ENV TZ=Asia/ShanghaiENV JAVA_OPTS="-Xms512m -Xmx1024m -Xss256k -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+UseCGroupMemoryLimitForHeap -XX:+HeapDumpOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom"ENV EXT_ARG="-Dserver.port=8080 -Dspring.cloud.nacos.config.enabled=false -Dspring.cloud.nacos.discovery.server-addr=svc-nacos:8848 -Dspring.cloud.nacos.discovery.namespace=public"RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneENTRYPOINT java  $JAVA_OPTS $EXT_ARG -Dserver.port=$APP_PORT -jar /data/cycube/demo.jar

docker build -t demo3:v1 -f Dockerfile3 ./

运行成果:

docker run --name demo3 -p 8083:8082 -d demo3:v1

日志:

docker logs -f demo3

外部运行:

应用run-java.sh

FROM fabric8/java-alpine-openjdk8-jre:1.9.0WORKDIR /deploymentsCOPY target/demo.jar /deployments/EXPOSE 8080ENV APP_PORT=8080ENV TZ=Asia/ShanghaiENV JAVA_OPTIONS="-Xms512m -Xmx1024m -Xss256k -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+UseCGroupMemoryLimitForHeap -XX:+HeapDumpOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom -Dserver.port=8080 -Dspring.cloud.nacos.config.enabled=false -Dspring.cloud.nacos.discovery.server-addr=svc-nacos:8848 -Dspring.cloud.nacos.discovery.namespace=public"RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneENTRYPOINT ./run-java.sh

打镜像:

docker build -t demo3:v2 -f Dockerfile32 ./

镜像大小一样:120M左右;

运行:

docker run --name demo32 -p 8084:8080 demo3:v2

看日志,默认关上了 jolokia的端口 8778 , jmx_export的端口 9779 ;

登录进去看看;
官网是说反对多种shell指令:

这个镜像是基于openJDK8 jre版本;
他含有:

  1. 一个Bond Agent, 应用 jolokia和 prometheus

号称万能的java启动脚本;更多能力待开掘,前面专题分享;

比照

版本/比照维度openjdk:8u312-jre-slim-busteropenjdk:8u212-jre-alpine3.9fabric8/java-alpine-openjdk8-jre:19
RootWebApplicationContext Init858ms832ms864ms
jvm start1.647s1.57s1.693s
java 版本openjdk version "1.8.0_212"openjdk version "1.8.0_275"
体积大小207M105M129M
根底镜像大小187M85M109M
零碎版本Linux 2e8c6adc94c6 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 Linux

最终抉择居中的:
fabric8/java-alpine-openjdk8-jre:19

预置了一些监控;

java -Xms512m -Xmx1024m -Xss256k -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+UseCGroupMemoryLimitForHeap -XX:+HeapDumpOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom -Dserver.port=8080 -Dspring.cloud.nacos.config.enabled=false -Dspring.cloud.nacos.discovery.server-addr=svc-nacos:8848 -Dspring.cloud.nacos.discovery.namespace=public -javaagent:/opt/agent-bond/agent-bond.jar=jolokia{{host=0.0.0.0}},jmx_exporter{{9779:/opt/agent-bond/jmx_exporter_config.yml}} -XX:ParallelGCThreads=1 -XX:ConcGCThreads=1 -Djava.util.concurrent.ForkJoinPool.common.parallelism=1 -XX:CICompilerCount=2 -XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:+ExitOnOutOfMemoryError -cp . -jar /deployments/api-devops-rest.jar

分为上面几种参数:

jvm参数-Xms512m -Xmx1024m -Xss256k -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+UseCGroupMemoryLimitForHeap -XX:+HeapDumpOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom -Dserver.port=8080 -Dspring.cloud.nacos.config.enabled=false -Dspring.cloud.nacos.discovery.server-addr=svc-nacos:8848 -Dspring.cloud.nacos.discovery.namespace=public
agent参数-javaagent:/opt/agent-bond/agent-bond.jar=jolokia{{host=0.0.0.0}},jmx_exporter{{9779:/opt/agent-bond/jmx_exporter_config.yml}}
jvm的垃圾收集参数-XX:ParallelGCThreads=1 -XX:ConcGCThreads=1 -Djava.util.concurrent.ForkJoinPool.common.parallelism=1 -XX:CICompilerCount=2 -XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:+ExitOnOutOfMemoryError -cp
#!/bin/sh# ===================================================================================# Generic startup script for running arbitrary Java applications with# being optimized for running in containers## Usage:#    # Execute a Java app:#    ./run-java.sh <args given to Java code>##    # Get options which can be used for invoking Java apps like Maven or Tomcat#    ./run-java.sh options [....]### This script will pick up either a 'fat' jar which can be run with "-jar"# or you can sepcify a JAVA_MAIN_CLASS.## Source and Documentation can be found# at https://github.com/fabric8io-images/run-java-sh## Env-variables evaluated in this script:## JAVA_OPTIONS: Checked for already set options# JAVA_MAX_MEM_RATIO: Ratio use to calculate a default maximum Memory, in percent.#                     E.g. the "50" value implies that 50% of the Memory#                     given to the container is used as the maximum heap memory with#                     '-Xmx'.#                     It defaults to "25" when the maximum amount of memory available#                     to the container is below 300M, otherwise defaults to "50".#                     It is a heuristic and should be better backed up with real#                     experiments and measurements.#                     For a good overviews what tuning options are available -->#                             https://youtu.be/Vt4G-pHXfs4#                             https://www.youtube.com/watch?v=w1rZOY5gbvk#                             https://vimeo.com/album/4133413/video/181900266# Also note that heap is only a small portion of the memory used by a JVM. There are lot# of other memory areas (metadata, thread, code cache, ...) which adds to the overall# size. When your container gets killed because of an OOM, then you should tune# the absolute values.# JAVA_INIT_MEM_RATIO: Ratio use to calculate a default intial heap memory, in percent.#                      By default this value is not set.## The following variables are exposed to your Java application:## CONTAINER_MAX_MEMORY: Max memory for the container (if running within a container)# MAX_CORE_LIMIT: Number of cores available for the container (if running within a container)# ==========================================================# Fail on a single failed command in a pipeline (if supported)(set -o | grep -q pipefail) && set -o pipefail# Fail on error and undefined varsset -eu# Save global script argsARGS="$@"# ksh is different for defining local varsif [ -n "${KSH_VERSION:-}" ]; then  alias local=typesetfi# Error is indicated with a prefix in the return valuecheck_error() {  local error_msg="$1"  if echo "${error_msg}" | grep -q "^ERROR:"; then    echo "${error_msg}"    exit 1  fi}# The full qualified directory where this script is located inscript_dir() {  # Default is current directory  local dir=$(dirname "$0")  local full_dir=$(cd "${dir}" && pwd)  echo ${full_dir}}# Try hard to find a sane default jar-fileauto_detect_jar_file() {  local dir="$1"  # Filter out temporary jars from the shade plugin which start with 'original-'  local old_dir="$(pwd)"  cd ${dir}  if [ $? = 0 ]; then    # NB: Find both (single) JAR *or* WAR <https://github.com/fabric8io-images/run-java-sh/issues/79>    local nr_jars="$(ls 2>/dev/null | grep -e '.*\.jar$' -e '.*\.war$' | grep -v '^original-' | wc -l | awk '{print $1}')"    if [ "${nr_jars}" = 1 ]; then      ls 2>/dev/null | grep -e '.*\.jar$' -e '.*\.war$' | grep -v '^original-'      exit 0    fi    cd "${old_dir}"    echo "ERROR: Neither JAVA_MAIN_CLASS nor JAVA_APP_JAR is set and ${nr_jars} found in ${dir} (1 expected)"  else    echo "ERROR: No directory ${dir} found for auto detection"  fi}# Check directories (arg 2...n) for a jar file (arg 1)find_jar_file() {  local jar="$1"  shift;  # Absolute path check if jar specifies an absolute path  if [ "${jar}" != ${jar#/} ]; then    if [ -f "${jar}" ]; then      echo "${jar}"    else      echo "ERROR: No such file ${jar}"    fi  else    for dir in $*; do      if [ -f "${dir}/$jar" ]; then        echo "${dir}/$jar"        return      fi    done    echo "ERROR: No ${jar} found in $*"  fi}# Generic formula evaluation based on awkcalc() {  local formula="$1"  shift  echo "$@" | awk '    function ceil(x) {      return x % 1 ? int(x) + 1 : x    }    function log2(x) {      return log(x)/log(2)    }    function max2(x, y) {      return x > y ? x : y    }    function round(x) {      return int(x + 0.5)    }    {print '"int(${formula})"'}  '}# Based on the cgroup limits, figure out the max number of core we should utilizecore_limit() {  local cpu_period_file="/sys/fs/cgroup/cpu/cpu.cfs_period_us"  local cpu_quota_file="/sys/fs/cgroup/cpu/cpu.cfs_quota_us"  if [ -r "${cpu_period_file}" ]; then    local cpu_period="$(cat ${cpu_period_file})"    if [ -r "${cpu_quota_file}" ]; then      local cpu_quota="$(cat ${cpu_quota_file})"      # cfs_quota_us == -1 --> no restrictions      if [ ${cpu_quota:-0} -ne -1 ]; then        echo $(calc 'ceil($1/$2)' "${cpu_quota}" "${cpu_period}")      fi    fi  fi}max_memory() {  # High number which is the max limit until which memory is supposed to be  # unbounded.  local mem_file="/sys/fs/cgroup/memory/memory.limit_in_bytes"  if [ -r "${mem_file}" ]; then    local max_mem_cgroup="$(cat ${mem_file})"    local max_mem_meminfo_kb="$(cat /proc/meminfo | awk '/MemTotal/ {print $2}')"    local max_mem_meminfo="$(expr $max_mem_meminfo_kb \* 1024)"    if [ ${max_mem_cgroup:-0} != -1 ] && [ ${max_mem_cgroup:-0} -lt ${max_mem_meminfo:-0} ]    then      echo "${max_mem_cgroup}"    fi  fi}init_limit_env_vars() {  # Read in container limits and export the as environment variables  local core_limit="$(core_limit)"  if [ -n "${core_limit}" ]; then    export CONTAINER_CORE_LIMIT="${core_limit}"  fi  local mem_limit="$(max_memory)"  if [ -n "${mem_limit}" ]; then    export CONTAINER_MAX_MEMORY="${mem_limit}"  fi}init_java_major_version() {    # Initialize JAVA_MAJOR_VERSION variable if missing    if [ -z "${JAVA_MAJOR_VERSION:-}" ]; then        local full_version=""        # Parse JAVA_VERSION variable available in containers        if [ -n "${JAVA_VERSION:-}" ]; then            full_version="$JAVA_VERSION"        elif [ -n "${JAVA_HOME:-}" ] && [ -r "${JAVA_HOME}/release" ]; then            full_version="$(grep -e '^JAVA_VERSION=' ${JAVA_HOME}/release | sed -e 's/.*\"\([0-9.]\{1,\}\).*/\1/')"        else            full_version=$(java -version 2>&1 | head -1 | sed -e 's/.*\"\([0-9.]\{1,\}\).*/\1/')        fi        export JAVA_MAJOR_VERSION=$(echo $full_version | sed -e 's/[^0-9]*\(1\.\)\{0,1\}\([0-9]\{1,\}\).*/\2/')    fi}load_env() {  local script_dir="$1"  # Configuration stuff is read from this file  local run_env_sh="run-env.sh"  # Load default default config  if [ -f "${script_dir}/${run_env_sh}" ]; then    . "${script_dir}/${run_env_sh}"  fi  # Check also $JAVA_APP_DIR. Overrides other defaults  # It's valid to set the app dir in the default script  JAVA_APP_DIR="${JAVA_APP_DIR:-${script_dir}}"  if [ -f "${JAVA_APP_DIR}/${run_env_sh}" ]; then    . "${JAVA_APP_DIR}/${run_env_sh}"  fi  export JAVA_APP_DIR  # JAVA_LIB_DIR defaults to JAVA_APP_DIR  export JAVA_LIB_DIR="${JAVA_LIB_DIR:-${JAVA_APP_DIR}}"  if [ -z "${JAVA_MAIN_CLASS:-}" ] && [ -z "${JAVA_APP_JAR:-}" ]; then    JAVA_APP_JAR="$(auto_detect_jar_file ${JAVA_APP_DIR})"    check_error "${JAVA_APP_JAR}"  fi  if [ -n "${JAVA_APP_JAR:-}" ]; then    local jar="$(find_jar_file ${JAVA_APP_JAR} ${JAVA_APP_DIR} ${JAVA_LIB_DIR})"    check_error "${jar}"    export JAVA_APP_JAR="${jar}"  else    export JAVA_MAIN_CLASS  fi}# Check for standard /opt/run-java-options first, fallback to run-java-options in the path if not existingrun_java_options() {  if [ -f "/opt/run-java-options" ]; then    echo "$(. /opt/run-java-options)"  else    which run-java-options >/dev/null 2>&1    if [ $? = 0 ]; then      echo "$(run-java-options)"    fi  fi}debug_options() {  if [ -n "${JAVA_ENABLE_DEBUG:-}" ] || [ -n "${JAVA_DEBUG_ENABLE:-}" ] ||  [ -n "${JAVA_DEBUG:-}" ]; then          local debug_port="${JAVA_DEBUG_PORT:-5005}"    local suspend_mode="n"    if [ -n "${JAVA_DEBUG_SUSPEND:-}" ]; then      if ! echo "${JAVA_DEBUG_SUSPEND}" | grep -q -e '^\(false\|n\|no\|0\)$'; then        suspend_mode="y"      fi    fi    local address_prefix=""          if [ "${JAVA_MAJOR_VERSION:-0}" -ge "9" ]; then      address_prefix="*:"          fi          echo "-agentlib:jdwp=transport=dt_socket,server=y,suspend=${suspend_mode},address=${address_prefix}${debug_port}"  fi}# Read in a classpath either from a file with a single line, colon separated# or given line-by-line in separate lines# Arg 1: path to claspath (must exist), optional arg2: application jar, which is stripped from the classpath in# multi line arrangementsformat_classpath() {  local cp_file="$1"  local app_jar="${2:-}"  local wc_out="$(wc -l $1 2>&1)"  if [ $? -ne 0 ]; then    echo "Cannot read lines in ${cp_file}: $wc_out"    exit 1  fi  local nr_lines=$(echo $wc_out | awk '{ print $1 }')  if [ ${nr_lines} -gt 1 ]; then    local sep=""    local classpath=""    while read file; do      local full_path="${JAVA_LIB_DIR}/${file}"      # Don't include app jar if include in list      if [ "${app_jar}" != "${full_path}" ]; then        classpath="${classpath}${sep}${full_path}"      fi      sep=":"    done < "${cp_file}"    echo "${classpath}"  else    # Supposed to be a single line, colon separated classpath file    cat "${cp_file}"  fi}# ==========================================================================memory_options() {  echo "$(calc_init_memory) $(calc_max_memory)"  return}# Check for memory options and set max heap size if neededcalc_max_memory() {  # Check whether -Xmx is already given in JAVA_OPTIONS  if echo "${JAVA_OPTIONS:-}" | grep -q -- "-Xmx"; then    return  fi  if [ -z "${CONTAINER_MAX_MEMORY:-}" ]; then    return  fi  # Check for the 'real memory size' and calculate Xmx from the ratio  if [ -n "${JAVA_MAX_MEM_RATIO:-}" ]; then    if [ "${JAVA_MAX_MEM_RATIO}" -eq 0 ]; then      # Explicitely switched off      return    fi    calc_mem_opt "${CONTAINER_MAX_MEMORY}" "${JAVA_MAX_MEM_RATIO}" "mx"  # When JAVA_MAX_MEM_RATIO not set and JVM >= 10 no max_memory  elif [ "${JAVA_MAJOR_VERSION:-0}" -ge "10" ]; then    return  elif [ "${CONTAINER_MAX_MEMORY}" -le 314572800 ]; then    # Restore the one-fourth default heap size instead of the one-half below 300MB threshold    # See https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size    calc_mem_opt "${CONTAINER_MAX_MEMORY}" "25" "mx"  else    calc_mem_opt "${CONTAINER_MAX_MEMORY}" "50" "mx"  fi}# Check for memory options and set initial heap size if requestedcalc_init_memory() {  # Check whether -Xms is already given in JAVA_OPTIONS.  if echo "${JAVA_OPTIONS:-}" | grep -q -- "-Xms"; then    return  fi  # Check if value set  if [ -z "${JAVA_INIT_MEM_RATIO:-}" ] || [ -z "${CONTAINER_MAX_MEMORY:-}" ] || [ "${JAVA_INIT_MEM_RATIO}" -eq 0 ]; then    return  fi  # Calculate Xms from the ratio given  calc_mem_opt "${CONTAINER_MAX_MEMORY}" "${JAVA_INIT_MEM_RATIO}" "ms"}calc_mem_opt() {  local max_mem="$1"  local fraction="$2"  local mem_opt="$3"  local val=$(calc 'round($1*$2/100/1048576)' "${max_mem}" "${fraction}")  echo "-X${mem_opt}${val}m"}c2_disabled() {  if [ -n "${CONTAINER_MAX_MEMORY:-}" ]; then    # Disable C2 compiler when container memory <=300MB    if [ "${CONTAINER_MAX_MEMORY}" -le 314572800 ]; then      echo true      return    fi  fi  echo false}jit_options() {  if [ "${JAVA_MAJOR_VERSION:-0}" -ge "10" ]; then    return  fi  # Check whether -XX:TieredStopAtLevel is already given in JAVA_OPTIONS  if echo "${JAVA_OPTIONS:-}" | grep -q -- "-XX:TieredStopAtLevel"; then    return  fi  if [ $(c2_disabled) = true ]; then    echo "-XX:TieredStopAtLevel=1"  fi}# Switch on diagnostics except when switched offdiagnostics_options() {  if [ -n "${JAVA_DIAGNOSTICS:-}" ]; then    if [ "${JAVA_MAJOR_VERSION:-0}" -ge "11" ]; then      echo "-XX:NativeMemoryTracking=summary -Xlog:gc*:stdout:time -XX:+UnlockDiagnosticVMOptions"    else      echo "-XX:NativeMemoryTracking=summary -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UnlockDiagnosticVMOptions"    fi  fi}# Replicate thread ergonomics for tiered compilation.# This could ideally be skipped when tiered compilation is disabled.# The algorithm is taken from:# OpenJDK / jdk8u / jdk8u / hotspot# src/share/vm/runtime/advancedThresholdPolicy.cppci_compiler_count() {  local core_limit="$1"  local log_cpu=$(calc 'log2($1)' "$core_limit")  local loglog_cpu=$(calc 'log2(max2($1,1))' "$log_cpu")  local count=$(calc 'max2($1*$2,1)*3/2' "$log_cpu" "$loglog_cpu")  local c1_count=$(calc 'max2($1/3,1)' "$count")  local c2_count=$(calc 'max2($1-$2,1)' "$count" "$c1_count")  [ $(c2_disabled) = true ] && echo "$c1_count" || echo $(calc '$1+$2' "$c1_count" "$c2_count")}cpu_options() {  # JVMs >= 10 know about CPU limits  if [ "${JAVA_MAJOR_VERSION:-0}" -ge "10" ]; then    return  fi  local core_limit="${JAVA_CORE_LIMIT:-}"  if [ "$core_limit" = "0" ]; then    return  fi  if [ -n "${CONTAINER_CORE_LIMIT:-}" ]; then    if [ -z ${core_limit} ]; then      core_limit="${CONTAINER_CORE_LIMIT}"    fi    echo "-XX:ParallelGCThreads=${core_limit} " \         "-XX:ConcGCThreads=${core_limit} " \         "-Djava.util.concurrent.ForkJoinPool.common.parallelism=${core_limit} " \         "-XX:CICompilerCount=$(ci_compiler_count $core_limit)"  fi}#-XX:MinHeapFreeRatio=20  These parameters tell the heap to shrink aggressively and to grow conservatively.#-XX:MaxHeapFreeRatio=40  Thereby optimizing the amount of memory available to the operating system.heap_ratio() {  echo "-XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40"}# These parameters are necessary when running parallel GC if you want to use the Min and Max Heap Free ratios.# Skip setting gc_options if any other GC is set in JAVA_OPTIONS.# -XX:GCTimeRatio=4# -XX:AdaptiveSizePolicyWeight=90gc_options() {  if echo "${JAVA_OPTIONS:-}" | grep -q -- "-XX:.*Use.*GC"; then    return  fi  local opts=""  # for JVMs < 10 set GC settings  if [ -z "${JAVA_MAJOR_VERSION:-}" ] || [ "${JAVA_MAJOR_VERSION:-0}" -lt "10" ]; then    opts="${opts} -XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 $(heap_ratio)"  fi  if [ -z "${JAVA_MAJOR_VERSION:-}" ] || [ "${JAVA_MAJOR_VERSION:-}" != "7" ]; then    opts="${opts} -XX:+ExitOnOutOfMemoryError"  fi  echo $opts}java_default_options() {  # Echo options, trimming trailing and multiple spaces  echo "$(memory_options) $(jit_options) $(diagnostics_options) $(cpu_options) $(gc_options)" | awk '$1=$1'}# ==============================================================================# parse the URLparse_url() {  #[scheme://][user[:password]@]host[:port][/path][?params]  echo "$1" | sed -e "s+^\(\([^:]*\)://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/?]*\)\(:\([^/?]*\)\)\?.*$+ local scheme='\2' username='\4' password='\6' hostname='\7' port='\9'+"}java_proxy_options() {  local url="$1"  local transport="$2"  local ret=""  if [ -n "$url" ] ; then    eval $(parse_url "$url")    if [ -n "$hostname" ] ; then      ret="-D${transport}.proxyHost=${hostname}"    fi    if [ -n "$port" ] ; then      ret="$ret -D${transport}.proxyPort=${port}"    fi    if [ -n "$username" -o -n "$password" ] ; then      echo "WARNING: Proxy URL for ${transport} contains authentication credentials, these are not supported by java" >&2    fi  fi  echo "$ret"}# Check for proxy options and echo if enabled.proxy_options() {  local ret=""  ret="$(java_proxy_options "${https_proxy:-${HTTPS_PROXY:-}}" https)"  ret="$ret $(java_proxy_options "${http_proxy:-${HTTP_PROXY:-}}" http)"  local noProxy="${no_proxy:-${NO_PROXY:-}}"  if [ -n "$noProxy" ] ; then    ret="$ret -Dhttp.nonProxyHosts=$(echo "|$noProxy" | sed -e 's/,[[:space:]]*/|/g' | sed -e 's/[[:space:]]//g' | sed -e 's/|\./|\*\./g' | cut -c 2-)"  fi  echo "$ret"}# ==============================================================================# Set process name if possibleexec_args() {  EXEC_ARGS=""  if [ -n "${JAVA_APP_NAME:-}" ]; then    # Not all shells support the 'exec -a newname' syntax..    if $(exec -a test true 2>/dev/null); then      echo "-a '${JAVA_APP_NAME}'"    fi  fi}# Combine all java optionsjava_options() {  # Normalize spaces with awk (i.e. trim and elimate double spaces)  # See e.g. https://www.physicsforums.com/threads/awk-1-1-1-file-txt.658865/ for an explanation  # of this awk idiom  echo "${JAVA_OPTIONS:-} $(run_java_options) $(debug_options) $(proxy_options) $(java_default_options)" | awk '$1=$1'}# Fetch classpath from env or from a local "run-classpath" fileclasspath() {  local cp_path="."  if [ "${JAVA_LIB_DIR}" != "${JAVA_APP_DIR}" ]; then    cp_path="${cp_path}:${JAVA_LIB_DIR}"  fi  if [ -z "${JAVA_CLASSPATH:-}" ] && [ -n "${JAVA_MAIN_CLASS:-}" ]; then    if [ -n "${JAVA_APP_JAR:-}" ]; then      cp_path="${cp_path}:${JAVA_APP_JAR}"    fi    if [ -f "${JAVA_LIB_DIR}/classpath" ]; then      # Classpath is pre-created and stored in a 'run-classpath' file      cp_path="${cp_path}:$(format_classpath ${JAVA_LIB_DIR}/classpath ${JAVA_APP_JAR:-})"    else      # No order implied      cp_path="${cp_path}:${JAVA_APP_DIR}/*"    fi  elif [ -n "${JAVA_CLASSPATH:-}" ]; then    # Given from the outside    cp_path="${JAVA_CLASSPATH}"  fi  echo "${cp_path}"}# Checks if a flag is present in the arguments.hasflag() {    local filters="$@"    for var in $ARGS; do        for filter in $filters; do          if [ "$var" = "$filter" ]; then              echo 'true'              return          fi        done    done}# ==============================================================================options() {    if [ -z ${1:-} ]; then      java_options      return    fi    local ret=""    if [ $(hasflag --debug) ]; then      ret="$ret $(debug_options)"    fi    if [ $(hasflag --proxy) ]; then      ret="$ret $(proxy_options)"    fi    if [ $(hasflag --java-default) ]; then      ret="$ret $(java_default_options)"    fi    if [ $(hasflag --memory) ]; then      ret="$ret $(memory_options)"    fi    if [ $(hasflag --jit) ]; then      ret="$ret $(jit_options)"    fi    if [ $(hasflag --diagnostics) ]; then      ret="$ret $(diagnostics_options)"    fi    if [ $(hasflag --cpu) ]; then      ret="$ret $(cpu_options)"    fi    if [ $(hasflag --gc) ]; then      ret="$ret $(gc_options)"    fi    echo $ret | awk '$1=$1'}# Start JVMrun() {  # Initialize environment  load_env $(script_dir)  local args  cd ${JAVA_APP_DIR}  if [ -n "${JAVA_MAIN_CLASS:-}" ] ; then     args="${JAVA_MAIN_CLASS}"  elif [ -n "${JAVA_APP_JAR:-}" ]; then     args="-jar ${JAVA_APP_JAR}"  else     echo "Either JAVA_MAIN_CLASS or JAVA_APP_JAR needs to be given"     exit 1  fi  # Don't put ${args} in quotes, otherwise it would be interpreted as a single arg.  # However it could be two args (see above). zsh doesn't like this btw, but zsh is not  # supported anyway.  echo exec $(exec_args) java $(java_options) -cp "$(classpath)" ${args} "$@"  exec $(exec_args) java $(java_options) -cp "$(classpath)" ${args} "$@"}# =============================================================================# Fire up# Initialize JAVA_MAJOR_VERSION variable if missinginit_java_major_version# Set env vars reflecting limitsinit_limit_env_varsfirst_arg=${1:-}if [ "${first_arg}" = "options" ]; then  # Print out options only  shift  options $@  exit 0elif [ "${first_arg}" = "run" ]; then  # Run is the default command, but can be given to allow "options"  # as first argument to your  shiftfirun "$@"

增加skywalkingclient包;

而后运行:

本地测试:

参考资料

docker近程机器制作镜像
https://cloud.tencent.com/developer/article/1903257

基于fabric8/java-alpine-openjdk8-jre:1.9.0 制作镜像并运行
http://go.coder55.com/article/89143

原创不易,关注诚可贵,转发价更高!转载请注明出处,让咱们互通有无,共同进步,欢送沟通交流。