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