【问题标题】:Use O/S Env Var for OpenShift Deployment Environment Configuration使用 O/S Env Var 进行 OpenShift 部署环境配置
【发布时间】:2018-09-24 02:35:01
【问题描述】:

我想为 OpenShift pod 提供一个环境变量,并在该变量中引用容器中定义的其他环境变量。

例如,我在 OpenShift 中定义了一个名为 JAVA_CMD_LINE 的环境变量,并将其设置为:

$HEAP_SETTING -Djavax.net.ssl.trustStore=/var/.keystore/cacerts -jar abc.jar

其中 $HEAP_SETTING 在容器启动时设置为 -XMX=1G。

在我的容器中,有一个如下所示的启动脚本:

java $JAVA_CMD_LINE

我期望的是容器运行后,会执行以下操作:

java -XMX=1G -Djavax.net.ssl.trustStore=/var/.keystore/cacerts -jar abc.jar

但我看到的是:

java '$HEAP_SETTING' -Djavax.net.ssl.trustStore=/var/.keystore/cacerts -jar abc.jar

如何提供变量?

更新:从 YML 文件添加详细信息。

spec:
  containers:
    - env:
        - name: OPENSHIFT_ENABLE_OAUTH
          value: 'true'
        - name: OPENSHIFT_ENABLE_REDIRECT_PROMPT
          value: 'true'
        - name: KUBERNETES_MASTER
          value: 'https://kubernetes.default:443'
        - name: KUBERNETES_TRUST_CERTIFICATES
          value: 'true'
        - name: JAVA_CMD_LINE
          value: >-
            -Djavax.net.ssl.trustStore=/var/cert/.keystore/cacerts
            -Dfile.encoding=UTF8
            $HEAP_SETTING

更新 2 - 我看到的错误:

+ exec java -Djavax.net.ssl.trustStore=/var/jenk-cert/.keystore/cacerts -Djavax.net.ssl.trustStorePassword=changeit -Dfile.encoding=UTF8 '$(HEAP_SETTING)' -Duser.home=/var/lib/jenkins -Djavamelody.application-name=JENKINS -jar /usr/lib/jenkins/jenkins.war
Picked up JAVA_TOOL_OPTIONS: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Dsun.zip.disableMemoryMapping=true
Error: Could not find or load main class $(HEAP_SETTING)

【问题讨论】:

  • 你能分享清单吗?没有看到它是不可能说出来的。
  • 这是您自己的 Java 映像,还是您使用的是 OpenShift S2I 映像之一?
  • 这是我自己的形象。基于 OpenShift Jenkins 镜像
  • @MichaelHausenblas,已添加清单详细信息。
  • 您用于构建自定义映像的 Git 存储库是否在公共存储库上可用,以便我们查看?或者当您说基于 OpenShift Jenkins 映像时,这是否意味着您复制了它的 repo 并对其进行了修改,或者您在派生的 docker build 中使用FROM 来创建它? HEAP_SETTING 实际设置在哪里?

标签: openshift openshift-origin


【解决方案1】:

尝试使用:

spec:
  containers:
    - env:
        - name: OPENSHIFT_ENABLE_OAUTH
          value: 'true'
        - name: OPENSHIFT_ENABLE_REDIRECT_PROMPT
          value: 'true'
        - name: KUBERNETES_MASTER
          value: 'https://kubernetes.default:443'
        - name: KUBERNETES_TRUST_CERTIFICATES
          value: 'true'
        - name: JAVA_CMD_LINE
          value: >-
            -Djavax.net.ssl.trustStore=/var/cert/.keystore/cacerts
            -Dfile.encoding=UTF8
            $(HEAP_SETTING)

在设置环境变量的值时,如果需要从已经设置的其他环境变量中组合值,可以在值中使用$(<VARNAME>)

IOW,使用$(HEAP_SETTING) 而不仅仅是$HEAP_SETTING


更新 1

实际上这行不通。这是因为HEAP_SETTING 不在您通过部署配置设置的环境变量集中,因此它将传递文字值$(HEAP_SETTING)。这不能用于您尝试使用的环境变量由映像中的启动代码填充的情况。

【讨论】:

  • 谢谢。你的意思是我正在尝试的事情是不可能的?
  • 不知道您添加的内容在做什么,也不知道您使用的是什么基础镜像,因此无法提供任何建议。 github.com/openshift/jenkins 的 OpenShift jenkins 图像存储库的源代码中不存在 HEAP_SETTINGJAVA_CMD_LINE 变量如果它们来自您的更改,那么您应该可以控制更改内容,但只能猜测因为不知道你现在有什么。
  • FWIW,JAVA_CMD_LINE 消除现有命令行参数的事实看起来是错误的。通常你会实现一些东西,以便环境变量被添加到命令行中,而不是清除在基本映像中定义的部分。如果这样做,这将不是问题。
  • 谢谢格雷厄姆,上面的例子是我实际所做的简化版本。实际上,我正在将证书文件的路径添加到 Java 命令行。该图像使用 JENKINS_JAVA_OPTS 来指定 JVM 参数,我可以毫不费力地覆盖它以获得我的证书路径,但这样做我会丢失其他值。问题的症结在于OpenShift是否可以设置一个环境变量来引用容器内定义的其他变量。
  • 在设置之前不能使用HEAP_SETTING。在正常使用中,没有惰性求值的概念,如果最初没有设置该值,那么稍后会神奇地注入该值。首次使用时将替换为空值。所以我真的看不出有任何其他方法可以轻松做到这一点。
猜你喜欢
  • 2022-01-14
  • 2018-03-11
  • 2021-10-14
  • 1970-01-01
  • 2020-03-25
  • 2018-11-24
  • 2018-01-20
  • 2018-06-14
  • 2020-01-14
相关资源
最近更新 更多