在无分布式环境中将可定制的选项传递给 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 本身支持的环境变量,或任何其他设置方式?
我不想:
- 硬编码 Docker 图像中的值
- 通过 predefining them during native-image build
对值进行硬编码
我不确定它是否有效,但您可以尝试将环境变量 JAVA_TOOL_OPTIONS
设置为所需的值:
JAVA_TOOL_OPTIONS=-XmxNNN
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
对于上下文,我正在 Kubernetes 中的 distroless docker 映像上构建编译为 GraalVM 本机映像 运行 的 java 应用程序。
我一直在尝试做一些相当简单的事情,但碰壁了:我想通过 -XmxNNN
为每个环境设置自定义堆大小限制。为此,我希望 运行 应用程序使用的选项将保存在环境变量中。问题的出现是由于使用了 distroless 映像 - 它没有 bash,因此 ENTRYPOINT /application $OPTIONS
不起作用。
是否有 GraalVM 本身支持的环境变量,或任何其他设置方式?
我不想:
- 硬编码 Docker 图像中的值
- 通过 predefining them during native-image build 对值进行硬编码
我不确定它是否有效,但您可以尝试将环境变量 JAVA_TOOL_OPTIONS
设置为所需的值:
JAVA_TOOL_OPTIONS=-XmxNNN
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