如何将标志传递给由 Cloud Native Buildpacks (CNB) 构建的 Docker 容器中的 java 进程

How to pass flags to java process in Docker contatiner built by Cloud Native Buildpacks (CNB)

通常当我创建 Docker 图像时,我会这样做:

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。

使用内置 gradle plugin from Spring Boot 打包 OCI 图像看起来很有趣,但我找不到如何在构建包中做类似的事情 - 我想为 java 进程设置一些标志,所以我该怎么做?

According to the Paketo.io docs 有两种环境变量可以传递给 Paketo 构建:

  1. Build-time Environment Variables
  2. Runtime Environment Variables

如果我正确理解你的问题,你正在寻找一种配置运行时环境变量 (2.) 的方法。为此,您需要将环境变量传递给容器 运行ning 您的应用程序(之前由 CNB/Paketo 构建),例如通过使用 --env 标志。正如文档所述

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 的容器映像,那么您可以 运行 您的容器:

docker run --env "JAVA_TOOL_OPTIONS=-Xms1024m -Xmx2048m" v2t-api:latest

我可以建议您从 JAVA_OPTS 切换到 JAVA_TOOL_OPTIONS,因为在正常关闭的情况下您的应用程序将不会收到 sigterm 并且您的应用程序不会正确关闭(请参阅this so answer for more details).