首页 > 解决方案 > 如何在由 Cloud Native Buildpacks (CNB) 构建的 Docker 容器中将标志传递给 java 进程

问题描述

通常,当我创建 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 数量。

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

标签: spring-bootdockerbuildpack

解决方案


根据 Paketo.io 文档,有两种环境变量可以传递给 Paketo 构建:

  1. 构建时环境变量
  2. 运行时环境变量

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

用户可以通过在应用容器中设置环境变量来配置应用镜像的运行时特性。buildpack 提供的运行时组件 [..] 接受的变量名称以 BPL_ 为前缀,或者在 Paketo 之外具有众所周知的传统含义(例如 JAVA_TOOL_OPTIONS)。

因此,例如,如果您构建一个名为 的容器映像v2t-api:latest,那么您可以使用以下命令运行您的容器:

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

我可以建议您从 切换JAVA_OPTSJAVA_TOOL_OPTIONS,因为在正常关闭的情况下您的应用程序将不会收到 sigterm 并且您的应用程序不会正确关闭(有关更多详细信息,请参阅此答案)。


推荐阅读