将O/S环境变量用于OpenShift部署环境配置
我想为OpenShift pod提供一个环境变量,并在该变量中引用容器中定义的其他环境变量 例如,我在OpenShift中定义了一个名为JAVA_CMD_LINE的环境变量,并将其设置为:将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 我所期望
$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
。在正常使用中,没有延迟求值的概念,因此,如果最初没有设置值,则会在稍后神奇地注入该值。第一次使用时,它将替换为空值。所以我真的看不到任何其他的方法,你可以轻松地做到这一点。