我有一个使用Helm和Kubernetes部署的Python应用程序。我想从main.py中取出硬编码变量,并使它们在Helm中可配置。问题是,如果我将它们从main.py中提取出来,那么我就失去了使用python3 main.py运行代码的能力。然后我就失去了快速测试和迭代的能力,因为我需要为3-4位中的每个参数维护两个独立的系统。
在提取硬编码变量之前先提取main.py:
HOST = "http://host"
PORT = 1234
if __name__ == '__main__':
connect_to_server(HOST, PORT)新创建的values.yaml
host: "http://host"
port: "1234"新模板(例如,cronjob.yaml中容器的底部):
使用字符串作为环境变量整数(按舵机文档 )。
env:
- name: HOST
value: {{ required "host is required!" .Values.host | quote }}
- name: PORT
value: {{ required "port is required!" .Values.port | quote }}提取硬编码变量后的main.py::
if __name__ == '__main__':
try:
HOST = os.environ['HOST']
PORT = int(os.environ['PORT'])
connect_to_server(HOST, PORT)
except IndexError as e:
print("Unable to run app! No env vars defined outside Helm!")
raise e如果我把这个设置留在上面,当我执行python main.py时,它将不会运行。如果我想让它使用普通的python3 main.py 运行,那么我需要建立一个完全独立的并行系统来在本地管理我的环境变量。不太理想,感觉很难管理。我希望能够继续在本地快速测试,而无需在整个应用程序中为环境变量添加一堆try/catch异常。我知道我可以通过各种方式导入env,但我不想用相同的信息维护两个不同的系统。如何在Helm中添加env,同时在本地Python应用程序中仍然灵活?是否有方法导入本地values.yaml并将它们设置为与cronjob.yaml (即主机)中的名称相同的环境变量?或者,对于这个用例,还有什么我不知道的解决方案?
发布于 2019-12-17 18:55:24
您可以选择的一个选项是继续允许环境变量,但在没有设置环境变量的情况下提供默认设置。您可以使用get()方法轻松地做到这一点:
if __name__ == '__main__':
HOST = os.environ.get('HOST', 'http://host')
PORT = int(os.environ.get('PORT', '1234'))
connect_to_server(HOST, PORT)https://stackoverflow.com/questions/59380375
复制相似问题