如何在 运行 时间决定 Kubernetes 中的 Quarkus 应用程序参数?

How to decide Quarkus application arguments in Kubernetes at run-time?

我使用 picocli 构建了一个 Quarkus 2.7.1 控制台应用程序,其中包含多个子命令。我希望能够在 Kubernetes 集群中 运行 这个应用程序并在 运行 时决定它的参数。这样我就可以使用相同的容器映像 运行 集群内不同模式的应用程序。

为了开始,我添加了 JIB extension 并尝试使用配置值 quarkus.jib.jvm-arguments 设置参数。不幸的是,这个配置值似乎在构建时被锁定,所以我无法在 运行 时更新它。

接下来,我尝试设置 quarkus.args,同时使用 JIB 的默认设置。配置值文档使其听起来足够通用,但当应用程序在容器中 运行 时似乎没有影响。由于文档中对该配置值的大多数引用都是在开发模式的上下文中,我想知道是否可以在开发模式之外禁用它。

如何在容器映像中获取此应用程序 运行ning,其参数在 运行 时确定?

我今天早上通过一些试验找到了解决问题的方法。

使用 quarkus-container-image-docker 扩展(而不是 quarkus.jib.jvm-arguments)我能够使用模板 Dockerfile.jvm 并扩展它以将参数传递给 CLI。唯一需要更改的行是 ENTRYPOINT(详细信息包含在下面的代码片段中)。我更改了 ENTRYPOINT 形式(从 exec 到 shell)并添加了一个环境变量作为 pass-through 程序参数的参数。

FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3

ARG JAVA_PACKAGE=java-11-openjdk-headless
ARG RUN_JAVA_VERSION=1.3.8
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en'
# Install java and the run-java script
# Also set up permissions for user `1001`
RUN microdnf install curl ca-certificates ${JAVA_PACKAGE} \
    && microdnf update \
    && microdnf clean all \
    && mkdir /deployments \
    && chown 1001 /deployments \
    && chmod "g+rwX" /deployments \
    && chown 1001:root /deployments \
    && curl https://repo1.maven.org/maven2/io/fabric8/run-java-sh/${RUN_JAVA_VERSION}/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o /deployments/run-java.sh \
    && chown 1001 /deployments/run-java.sh \
    && chmod 540 /deployments/run-java.sh \
    && echo "securerandom.source=file:/dev/urandom" >> /etc/alternatives/jre/lib/security/java.security

# Configure the JAVA_OPTIONS, you can add -XshowSettings:vm to also display the heap size.
ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
# We make four distinct layers so if there are application changes the library layers can be re-used
COPY --chown=1001 target/quarkus-app/lib/ /deployments/lib/
COPY --chown=1001 target/quarkus-app/*.jar /deployments/
COPY --chown=1001 target/quarkus-app/app/ /deployments/app/
COPY --chown=1001 target/quarkus-app/quarkus/ /deployments/quarkus/

EXPOSE 8080
USER 1001

# [== BEFORE ==]
# ENTRYPOINT [ "/deployments/run-java.sh" ]
# [== AFTER ==]
ENTRYPOINT "/deployments/run-java.sh" $CLI_ARGUMENTS

您可以将 quarkus.jib.jvm-entrypoint 设置为您想要的任何容器入口点命令,包括脚本。 doc 中的一个示例是 quarkus.jib.jvm-entrypoint=/deployments/run-java.sh。您可以在这样的脚本中使用 $CLI_ARGUMENTS。即使像 quarkus.jib.jvm-entrypoint=/bin/sh,-c,'/deployments/run-java.sh $CLI_ARGUMENTS' 这样的东西也应该有效,只要您将脚本 run-java.sh 放在图像中的 /deployments 处。可能性是无限的。

如果有问题,另请参阅此 SO answer。 (link 中的 OP 将客户脚本放在 src/main/jib/docker/run-java.shsrc/main/jib 是 Jib 的默认“额外文件目录”),以便 Jib 将脚本放在图像中的 /docker/run-java.sh .