【问题标题】:In k8s yaml files, how to use environment variable in containers在 k8s yaml 文件中,如何在容器中使用环境变量
【发布时间】:2020-03-19 04:34:48
【问题描述】:

比如我做了一个spark:2.4.3 docker镜像,我在Dockerfile中设置了一个ENV SPARK_HOME。

当我在 yaml 文件中使用SPARK_HOME 时(见下面的代码),出现错误:

${SPARK_HOME}/sbin/start-master.sh: 没有这样的文件或目录

# ...
containers:
  - name: spark-master
    image: spark:2.4.3
    command: 
      - ${SPARK_HOME}/sbin/start-master.sh
      - --host 0.0.0.0
      - --port $(SPARK_MASTER_PORT) 
      - --webui-port $(SPARK_MASTER_WEBUI_PORT)
      - "&&"
      - tail -f $(SPARK_HOME)/logs/*
    env:
      - name: SPARK_MASTER_PORT
        valueFrom:
          configMapKeyRef:
            name: spark-config
            key: spark_master_port
      - name: SPARK_MASTER_WEBUI_PORT
        valueFrom:
          configMapKeyRef:
            name: spark-config
            key: spark_master_webui_port
# ...

这是否意味着我必须使用绝对路径?

有没有办法在 Kubernetes YAML 文件中使用环境变量?

【问题讨论】:

  • 在 pod 规范中唯一有效的变量扩展形式是 $(VARIABLE_NAME);在command: 的第一行中,大括号无法识别。
  • @DavidMaze 有些人在他们的规范中使用花括号,例如,github.com/Angatar/mysql-s3-backup/blob/master/…。他们为什么这样做?
  • 该特定行是sh -c 的参数,因此主容器进程是一个扩展它的shell。 Kubernetes 本身不会对该行做任何事情。

标签: kubernetes environment-variables yaml


【解决方案1】:

这样不行。

当您在 Dockerfile 中定义 ENV 时,您声明了在容器内部使用的变量。

当您在.yaml 文件中设置变量时,该变量应在主机级别定义。

如果您需要使用环境变量来运行程序,请使用 bash 脚本作为入口点:

#!/bin/bash
${SPARK_HOME}/sbin/start-master.sh \
--host 0.0.0.0
--port $(SPARK_MASTER_PORT) \
--webui-port $(SPARK_MASTER_WEBUI_PORT) \ 
&& tail -f $(SPARK_HOME)/logs/*

由于这个 bash 脚本在容器内执行,它会使用这些环境变量。

【讨论】:

    【解决方案2】:

    根据https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/#using-environment-variables-inside-of-your-config
    $(VAR)(圆括号,如 David Maze 所写)为args 工作。我的尝试表明它也被替换为command

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 2018-06-26
      • 1970-01-01
      • 2023-03-11
      • 2021-02-08
      • 2020-11-11
      • 2018-04-28
      • 1970-01-01
      • 2019-11-30
      相关资源
      最近更新 更多