使用Jib与基础镜像时JVM系统属性中环境变量未展开的问题咨询
问题背景与需求
我的Jib配置如下:
environment = [ 'QUARKUS_PROFILE' : 'test', 'TRUSTSTORE' : '/etc/ssl/certs/java/cacerts/keystore.jks', 'TRUSTSTORE_PASSWORD' : 'no.secret', 'JAVA_APP_JAR' : '/deployments/myapp-runner.jar', 'JAVA_APP_NAME' : 'myapp', // 尝试过使用JAVA_OPTS_APPEND或JAVA_TOOL_OPTIONS 'JAVA_OPTS_APPEND' : '-Djavax.net.ssl.trustStore=${TRUSTSTORE} -Djavax.net.ssl.trustStorePassword=${TRUSTSTORE_PASSWORD}', 'JAVA_TOOL_OPTIONS' : '-Djavax.net.ssl.trustStore=${TRUSTSTORE} -Djavax.net.ssl.trustStorePassword=${TRUSTSTORE_PASSWORD}' ] entrypoint = 'INHERIT'
我有一个自定义基础镜像,希望运行官方的run-java.sh脚本,并且能传入已展开环境变量值的JVM系统属性。
已尝试的操作
- 使用
JAVA_OPTS_APPEND:因为run-java.sh会读取该变量,原本以为能触发变量展开 - 使用
JAVA_TOOL_OPTIONS:了解到Jib会使用这个变量 - 在基础镜像和Jib配置中尝试多种ENTRYPOINT配置:
CMD ["/deployments/entrypoint.sh"]ENTRYPOINT ["/deployments/entrypoint.sh"]ENTRYPOINT ["/bin/sh", "-c", "/deployments/entrypoint.sh"]ENTRYPOINT exec "/deployments/entrypoint.sh"
- 在基础镜像中编写了自定义的
entrypoint-ssl.sh脚本:
FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:1.17 RUN <<EOF cat >> /deployments/entrypoint-ssl.sh #!/bin/bash startup() { echo "Running custom entrypoint for trustStore" exec -a "${JAVA_APP_NAME}" java -Djavax.net.ssl.trustStorePassword=${TRUSTSTORE_PASSWORD} -Djavax.net.ssl.trustStore=${TRUSTSTORE} -cp "." -jar ${JAVA_APP_JAR} $* } # startup $* EOF RUN chmod +x /deployments/entrypoint-ssl.sh
补充说明:ubi9镜像本身没有设置ENTRYPOINT,只配置了CMD:
CMD ["/opt/jboss/container/java/run/run-java.sh"]
当前可行的临时方案
- 方案a:直接在ENTRYPOINT中通过shell展开变量
ENTRYPOINT ["/bin/sh", "-c", "echo ${TRUSTSTORE}"] - 方案b:在Jib中使用包含完整启动命令的ENTRYPOINT,通过shell展开变量
entrypoint = ['/bin/sh', '-c','exec -a "${JAVA_APP_NAME}" java -Djavax.net.ssl.trustStorePassword=${TRUSTSTORE_PASSWORD} -Djavax.net.ssl.trustStore=${TRUSTSTORE} -cp "." -jar ${JAVA_APP_JAR} $*']
疑问
- 是否有办法在
JAVA_TOOL_OPTIONS或JAVA_OPTS_APPEND中直接展开环境变量? - 如果上述方法不可行,能否把方案b中的临时ENTRYPOINT逻辑移到基础镜像中?
内容的提问来源于stack exchange,提问作者Snedecor II
相关产品推荐
相关产品推荐

