spring-boot - 如何在由 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 进程设置一些标志,那么我该怎么做呢?
解决方案
根据 Paketo.io 文档,有两种环境变量可以传递给 Paketo 构建:
如果我正确理解您的问题,您正在寻找一种配置运行时环境变量 (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_OPTS
到JAVA_TOOL_OPTIONS
,因为在正常关闭的情况下您的应用程序将不会收到 sigterm 并且您的应用程序不会正确关闭(有关更多详细信息,请参阅此答案)。
推荐阅读
- sql-server - 参数无效 - System.Drawing.Image.FromStream(Ms)
- inheritance - 设计评论系统的正确方法是什么?
- c++ - 来自 libicu 的 u_snprintf_u 的性能问题
- java - 计算机猜谜游戏中的消息对话框
- suitescript2.0 - suitescript 2.0 无法评估
- sql - 从一个表中选择与另一个表中的 id 匹配的所有列
- python - 在找到或未找到正则表达式模式时记录一条消息(详细 re.sub)
- json.net - 从动态忽略 C# 关键字序列化 JSON
- python - python re.sub() 函数添加附加字符 - e - 垃圾字符
- perl - 如何读取以“\r”或“\n”结尾的行的无缓冲输入?