设置 Java/JRE 可以被 JAVA_TOOL_OPTIONS 覆盖的默认设置

Set Java/JRE default settings which can be overridden by JAVA_TOOL_OPTIONS

我有多个 java spring 引导服务,它们在 docker 容器中 运行 并通过 docker-compose 配置。这些服务中的每一个都需要几个 java 配置,这些配置是通过 JAVA_TOOL_OPTIONS 在 docker-compose.yml 中完成的,例如:

my-service:
    environment:
        JAVA_TOOL_OPTIONS: -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdumps/my-service.hprof -XX:+ExitOnOutOfMemoryError

到目前为止这有效。我的想法是将此默认配置放入 Dockerfile 中,例如:

ENTRYPOINT ["java", "-Xmx256m", "-XX:+HeapDumpOnOutOfMemoryError", "-XX:HeapDumpPath=/tmp/heapdumps/my-service.hprof", "-XX:+ExitOnOutOfMemoryError", "-jar", "/my-service.jar"]

这也很好用。问题是,现在我无法使用 JAVA_TOOL_OPTIONS 覆盖 Dockerfile 中的那些选项。因此,例如,我无法通过在 docker-compose.yml 中配置来停用 ExitOnOutOfMemoryError 选项,例如:

my-service:
    environment:
        JAVA_TOOL_OPTIONS: -XX:-ExitOnOutOfMemoryError

甚至更改最大堆大小。是否有可能实现此行为(以便我将默认配置内置到图像中,但有可能覆盖 docker-compose 中的单个配置选项)?

最后我们这样解决了:

我们将对 jar 的调用移到了 docker-entrypoint.sh 中,并只对该 .sh 文件进行了调用。我们还添加了额外的环境变量来存储默认配置。

Dockerfile

ENV DEFAULT_JAVA_TOOL_OPTIONS="-Xmx256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdumps/my-service.hprof -XX:+ExitOnOutOfMemoryError"

ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["/${project.build.finalName}.jar"]

并且在 docker-entrypoint.sh 中我们做了以下操作:

docker-entrypoint.sh

#!/bin/bash

JAVA_TOOL_OPTIONS="$DEFAULT_JAVA_TOOL_OPTIONS $JAVA_TOOL_OPTIONS"
java -jar ""

这样 JAVA_TOOL_OPTIONS 中设置的选项将处理默认选项