如何将标记传递给由Cloud Native Buildpacks(CNB)构建的Docker contatiner中的Java进程 [英] How to pass flags to java process in Docker contatiner built by Cloud Native Buildpacks (CNB)
问题描述
通常,当我创建Docker映像时,我会执行以下操作:
Normally when I create Docker image I do something like this:
FROM openjdk:15-jdk-slim
ARG version=undefined
LABEL version=${version}
WORKDIR /
COPY build/libs/v2t-api-$version.jar /v2t-api.jar
USER nobody
VOLUME ["/tmp"]
EXPOSE 8080
EXPOSE 8081
ENTRYPOINT ["sh", "-c", "exec java ${JAVA_OPTS} -jar v2t-api.jar"]
因此,当我在kubernetes中启动容器时,可以设置JAVA_OPTS,它定义了多少内存可用于堆或实际有多少CPU.
So, when I start my container in for example kubernetes I can set JAVA_OPTS which defines how many memory is available for heap or how many CPUs are actually there.
使用内置的 Spring Boot的gradle插件看起来很有趣,但是我找不到如何在buildpacks中做类似的事情-我想为Java进程设置一些标志,那么我该怎么做?
Packaging OCI Images using built-in gradle plugin from Spring Boot looks interesting, but I can't find how to do something similar in buildpacks - I would like to set some flags to java process, so how do I do that?
推荐答案
根据Paketo.io文档有两种可以传递给Paketo构建的环境变量:
According to the Paketo.io docs there are 2 kinds of environment variables one could pass to the Paketo build:
如果我正确理解了您的问题,那么您正在寻找一种配置运行时环境变量的方法(2.).为此,您需要将环境变量传递给运行您的应用程序的容器(之前由CNB/Paketo构建),例如通过使用-env
标志.如文档所述
If I understand your question correctly you're looking for a way to configure Runtime Environment variables (2.). In order to do that you need to pass environment variables to the container running your app (which was build by CNB/Paketo before) e.g. by using the --env
flag. As the docs state
用户可以通过设置来配置应用程序映像的运行时功能应用容器中的环境变量.变量名称由buildpack提供的运行时组件[..]接受的前缀为BPL_或具有众所周知的Paketo以外的常规含义(例如JAVA_TOOL_OPTIONS).
Users may configure runtime features of the app image by setting environment variables in the app container. The names of variables accepted by buildpack-provided runtime components [..] are prefixed with BPL_ or have well-known conventional meanings outside of Paketo (e.g JAVA_TOOL_OPTIONS).
例如,如果您构建一个名为 v2t-api:latest
的容器映像,则可以使用以下命令运行容器:
So for example if you build an container image called v2t-api:latest
, then you can run your container with:
docker run --env "JAVA_TOOL_OPTIONS=-Xms1024m -Xmx2048m" v2t-api:latest
我建议您从 JAVA_OPTS
切换到 JAVA_TOOL_OPTIONS
,因为在正常关机的情况下,您的应用程序不会收到sigterm.您的应用将无法正确关闭(请参阅此答案,以获取更多详细信息).
I can advice you to switch from JAVA_OPTS
to JAVA_TOOL_OPTIONS
, because your application won't receive the sigterm in case of a graceful shutdown & your app wouldn't be shutdown correctly (see this so answer for more details).
这篇关于如何将标记传递给由Cloud Native Buildpacks(CNB)构建的Docker contatiner中的Java进程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!