如何使用kubernetes env访问容器环境变量?

时间:2020-10-16 09:37:17

标签: docker kubernetes environment-variables

我正在尝试在Kubernetes上运行我的应用程序。我的Docker容器具有PATHLD_LIBRARY_PATH等环境变量,这些变量在Dockerfile中设置。我试图像这样在yaml文件中更改它们:

env:
- name: LD_LIBRARY_PATH
  value: "foo:$(LD_LIBRARY_PATH)"

以上配置无效,我只是在窗格中看到LD_LIBRARY_PATH=foo:$(LD_LIBRARY_PATH)。这种方法似乎适用于Kubernetes环境变量,例如KUBERNETES_PORT_443_TCP_PROTO,但不适用于Docker环境变量。

我的问题是:

  1. 我认为yaml中的env设置是在容器运行之前注入docker的,因此kubernetes无法读取LD_LIBRARY_PATH的值。因此,它不能更改变量。我明白吗?

  2. 如何使用kubernetes env更改容器环境变量?我知道我可以在yaml文件的command字段中设置env变量,但这似乎并不干净,还有其他方法可以做到这一点吗?

  3. 如果Kubernetes不能更改现有的env,这是否意味着yaml文件中的env字段仅用于添加新的env?

谢谢!

1 个答案:

答案 0 :(得分:4)

Kubernetes变量扩展语法仅适用于Kubernetes直接了解的内容。在容器内部,环境变量可能来自两个地方(Dockerfile ENV指令,基本容器环境本身,在入口点脚本中设置),而Kubernetes则不考虑这些。它只考虑相同容器规范中的内容。 API definition of EnvVar提示:

使用容器中先前定义的环境变量和所有服务环境变量来扩展变量引用$(VAR_NAME)。

您不能使用Kubernetes语法以您描述的方式更改环境变量。您只能引用同一env:块中的其他内容(可能来自ConfigMap或Secrets)以及来自其他服务的隐式变量。

(在Kubernetes级别更改路径类型变量没有多大意义。由于图像是独立的,因此它已经包含了所需的所有命令和库。在Kubernetes中很难注入更多工具或库;最好将它们直接安装在映像中,最好是安装在/usr/lib/usr/local/lib中,但如果失败,您可以像建议的那样在Dockerfile中更新ENV这里。)