我有一个Web应用程序,它有一个服务器端UI组件,需要与暴露REST接口的另一个组件通信。 UI需要知道REST组件公开的端点的地址。
当UI启动时,我设置了一个包含REST端点主机和端口的环境变量(ADDRESS_SERVICE_URI)。
我现在想要将此应用程序部署到Kubernetes中,但我希望以不对Kubernetes上的应用程序代码强制执行任何依赖的方式执行此操作。我希望使用Kubernetes公开的环境变量来帮助发现服务,所以我在UI的部署描述中有以下内容
env:
- name: ADDRESS_SERVICE_URI
value: http://${REST_SERVICE_HOST}:${REST_SERVICE_PORT}
我希望Kuberbetes可以评估环境变量,但它们似乎正在“按原样”传递给我的应用程序代码,因为我在代码执行时遇到以下异常。
java.lang.IllegalArgumentException: Illegal character in authority at index 7: http://${REST_SERVICE_HOST}:${REST_SERVICE_PORT}/addresses/postcode/WA11
java.net.URI.create(URI.java:852)
com.sun.jersey.api.client.Client.resource(Client.java:434)
uk.gov.dwp.digital.addresslookup.dao.impl.PostCodeDAOImpl.byPostCode(PostCodeDAOImpl.java:44)
uk.gov.dwp.digital.addresslookup.service.impl.PostCodeServiceImpl.byPostcode(PostCodeServiceImpl.java:17)
uk.gov.dwp.digital.addresslookup.controllers.PostCodeController.processSearchRequest(PostCodeController.java:83)
uk.gov.dwp.digital.addresslookup.controllers.PostCodeController.executeSearch(PostCodeController.java:59)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
是否有可能评估Kubernetes环境变量,或者我是否需要更改我的代码以期望变量作为两个单独的变量呈现给它,其名称是Kubernetes所指示的?
答案 0 :(得分:1)
自env
only appears to support key:value pairs以来,最好的办法是在启动应用之前使用ENTRYPOINT
脚本预先填充您的ENV。
<强> Dockerfile 强>
FROM yourbaseimage
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
<强> entrypoint.sh 强>
#!/bin/bash
export ADDRESS_SERVICE_URI="http://${REST_SERVICE_HOST}:${REST_SERVICE_PORT}"
exec "$@"