在无分布式环境中将可定制的选项传递给 GraalVM 图像执行

Passing customizable options to a GraalVM image execution in a distroless environment

对于上下文,我正在 Kubernetes 中的 distroless docker 映像上构建编译为 GraalVM 本机映像 运行 的 java 应用程序。

我一直在尝试做一些相当简单的事情,但碰壁了:我想通过 -XmxNNN 为每个环境设置自定义堆大小限制。为此,我希望 运行 应用程序使用的选项将保存在环境变量中。问题的出现是由于使用了 distroless 映像 - 它没有 bash,因此 ENTRYPOINT /application $OPTIONS 不起作用。

是否有 GraalVM 本身支持的环境变量,或任何其他设置方式?

我不想:

我不确定它是否有效,但您可以尝试将环境变量 JAVA_TOOL_OPTIONS 设置为所需的值:

JAVA_TOOL_OPTIONS=-XmxNNN

来自documentation

This environment variable allows you to specify the initialization of tools, specifically the launching of native or Java programming language agents using the -agentlib or -javaagent options. In the following example the environment variable is set so that the HPROF profiler is launched when > the application is started:

$ export JAVA_TOOL_OPTIONS="-agentlib:hprof"

This variable can also be used to augment the command line with other options for diagnostic purposes. For example, you can supply the -XX:OnError option to specify a script or command to be executed when a fatal error occurs.

GraalVM documentation 本身也提供了一个使用示例,尽管在不同的上下文中。

您可以使用 busybox 在无发行容器中获取 shell:

FROM gcr.io/distroless/base

...

COPY --from=amd64/busybox:1.31.1 /bin/busybox /busybox/busybox
RUN ["/busybox/busybox", "--install", "/bin"]

CMD ["/bin/sh", "-c", "java -version"]

你可以找到这种类型的例子 Dockerfile here

但我认为这个 busybox shell 不是必需的。

虽然 ENTRYPOINT /application $OPTIONS 行不通,但这个行得通 ENTRYPOINT ["myapp", "arguments"]

Note that distroless images by default do not contain a shell. That means the Dockerfile ENTRYPOINT command, when defined, must be specified in vector form, to avoid the container runtime prefixing with a shell.

来源:github