在k8s yaml文件中,如何在容器中使用环境变量

时间:2019-11-23 07:31:57

标签: kubernetes environment-variables yaml

例如,我制作了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文件中是否可以使用环境变量?

2 个答案:

答案 0 :(得分:2)

那行不通。

当您在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脚本在容器内执行时,它将利用这些环境变量。

答案 1 :(得分:0)

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