将O/S环境变量用于OpenShift部署环境配置

将O/S环境变量用于OpenShift部署环境配置,openshift,openshift-origin,Openshift,Openshift Origin,我想为OpenShift pod提供一个环境变量,并在该变量中引用容器中定义的其他环境变量 例如,我在OpenShift中定义了一个名为JAVA_CMD_LINE的环境变量,并将其设置为: $HEAP_SETTING -Djavax.net.ssl.trustStore=/var/.keystore/cacerts -jar abc.jar 其中,当容器启动时,$HEAP\u设置被设置为-XMX=1G 在我的容器中,有一个启动脚本,看起来像: java $JAVA_CMD_LINE 我所期望

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

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

$HEAP_SETTING -Djavax.net.ssl.trustStore=/var/.keystore/cacerts -jar abc.jar
其中,当容器启动时,$HEAP\u设置被设置为-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)
尝试使用:

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)
任何时候设置环境变量的值时,如果需要从已设置的其他环境变量合成值,可以在值中使用
$()

注意,使用
$(堆设置)
,而不仅仅是
$堆设置


更新1


其实这是行不通的。这是因为
HEAP\u设置
不在您通过部署配置设置的环境变量集中,因此它将传递文本值
$(HEAP\u设置)
。当您试图使用的环境变量由映像中的启动代码填充时,不能使用此选项。

您可以共享清单吗?如果看不到它,就无法判断。这是您自己的Java图像,还是您正在使用OpenShift S2I图像?这是我自己的图像。基于OpenShift-Jenkinsimage@MichaelHausenblas,添加了清单详细信息。您用于构建自定义映像的Git存储库是否在公共存储库中可用,以便我们查看?或者当你说是基于OpenShift Jenkins图像时,这是指你复制了它的回购协议并对其进行了修改,还是在派生docker构建中使用
FROM
来创建它?
HEAP\u设置实际设置在哪里?谢谢。你的意思是说我所尝试的是不可能的吗?如果你不知道你所添加的内容在做什么,也不知道你使用的是什么基本图像,就不可能给出任何建议。OpenShift jenkins image repo的repo源代码中既没有
HEAP\u设置
也没有
JAVA\u CMD\u LINE
变量如果它们来自您的更改,那么您应该可以控制更改内容,但只能猜测,因为不知道您当前拥有什么。FWIW,
JAVA\u CMD\u LINE
清除现有命令行参数的事实看起来是错误的。通常,您会实现一些功能,以便环境变量可以添加到命令行中,而不会删除在基本映像中定义的部分。如果这样做了,这就不会是问题。谢谢格雷厄姆,上面的例子是我实际做的一个简化版本。实际上,我正在向Java命令行添加一个cert文件的路径。该图像使用JENKINS_JAVA_OPTS指定JVM参数,我可以毫不费力地覆盖这些参数以获得证书路径,但这样做会丢失其他值。问题的关键在于OpenShift是否可以设置一个可以引用容器中定义的其他变量的环境变量。在设置之前,不能使用
HEAP\u SETTING
。在正常使用中,没有延迟求值的概念,因此,如果最初没有设置值,则会在稍后神奇地注入该值。第一次使用时,它将替换为空值。所以我真的看不到任何其他的方法,你可以轻松地做到这一点。