我有一个 Python 应用程序,它在 Kubernetes 配置中使用环境变量,例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
namespace: default
data:
var1: foo
var2: bar
---
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: default
spec:
containers:
- envFrom:
- configMapRef:
name: my-config
因此,当应用程序被 Dockerized 并在 Kubernetes 农场上运行时,这很好。
然而,当在没有 Docker 和 Kubernetes 的 本地机器 上运行应用程序时,只有一个简陋的命令:
python app.py
我必须让 Python 模块使用 os.getenv('var1')
即使没有 ConfigMap 或 Pod。
是否可以不需要在 Python 模块中添加额外的代码或向本地机器系统添加环境变量?
原文由 vahdet 发布,翻译遵循 CC BY-SA 4.0 许可协议
您将需要一个“加载器”小程序,它会使用适当的变量调用第二个程序。当然,在 Python 中使用它也更方便,因为一切都已经设置好了——但它可能会一直存在
(当然你需要安装一些第 3 方库来读取 yaml 配置文件 - 我已经使用
PyYAML
来测试这个)如果将上述脚本标记为可执行,则可以直接在命令行中使用它,而无需前缀“python3”——否则,如果将此文件命名为“runner.py”,则命令行可以是
如果您需要传递当前环境并仅使用脚本中的变量进行更新,请在
.run
调用之前执行此操作:另外,看到这将使用与它运行的相同的 Python 解释器来执行脚本,以一种或多或少天真的方式(只检查文字“.py”文件扩展名)——如果你需要它更健壮,它建议对目标脚本执行 stat 并检查它是否可执行 - 然后直接调用它 - 并且只对其他文件使用当前的 Python 解释器。
或者修改你的代码
由于您有一个脚本作为入口点,并且想要简化它在第 3 次馅饼中的运行,您可以更改它而不是使用通用加载程序 - 在这种情况下,我建议添加一个额外的配置变量来指示变量是已经正确设置 - 所以当脚本在其容器中运行时,它什么都不做 - 否则,它会加载上述数据,并更新其 os.envrion。
换句话说,在代码的入口点,做一些事情: