【问题标题】:How to access container environment variables with kubernetes env?如何使用 kubernetes env 访问容器环境变量?
【发布时间】:2021-01-30 19:50:57
【问题描述】:

我正在尝试在 Kubernetes 上运行我的应用程序。我的 docker 容器有 PATH 和 LD_LIBRARY_PATH 等环境变量,它们是在 Dockerfile 中设置的。我尝试像这样在 yaml 文件中更改它们:

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

上面的配置不行,我只是在pod里看到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 字段中设置环境变量,但这似乎不干净,还有其他方法吗?

  3. 如果 Kubernetes 不能改变已经存在的 envs,是否意味着 yaml 文件中的 env 字段是设计用来添加新的 envs 的?

谢谢!

【问题讨论】:

    标签: docker kubernetes environment-variables


    【解决方案1】:

    Kubernetes 变量扩展语法只适用于 Kubernetes 直接知道的东西。在容器内部,环境变量可能来自几个地方(Dockerfile ENV 指令、基本容器环境本身、入口点脚本中的设置),Kubernetes 不考虑其中任何一个;它只考虑相同容器规范中的事物。 API definition of EnvVar 暗示了这一点:

    变量引用 $(VAR_NAME) 使用容器中先前定义的环境变量和任何服务环境变量进行扩展。

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

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

    【讨论】:

    • 谢谢大卫。你的回答真的很有帮助。我还有一个问题:“来自其他服务的隐式变量”是什么意思?
    • Kubernetes defines a couple of environment variables based on other Services;该格式与古老的 Docker 链接功能产生的环境变量相匹配。我不会依赖这些,但它们在这种情况下可用。
    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多