Dockerfile ENV变量替换为另一个ENV变量

时间:2019-10-21 07:18:52

标签: docker dockerfile

我正在学习Docker并面临将一个env变量的值替换为另一个env变量的问题。

这是我的Dockerfile

FROM ubuntu

ENV var_env=Tarun

ENV command="echo Hello $var_env"

CMD ["sh","-c","echo Hello $var_env"]

现在,使用标记名称“ exp”构建它之后,然后

sudo docker run -e  "var_env=New Env Value" exp

它给我正确的输出为

Hello New Env Value

但是,如果我看到通过执行关联的环境变量

sudo docker run -e  "var_env=New Env Value" exp env

它给了我这个输出:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=138aa8852d8d
var_env=New Env Value
command=echo Hello Tarun
HOME=/root

其中var_env环境变量的值被更改,command环境变量的值保持不变。

我需要找到一种方法,以便如果通过上述命令更改var_env环境变量的值,它将更新var_env环境变量中的command环境变量的值也。

以供参考:https://docs.docker.com/engine/reference/builder/#environment-replacement

1 个答案:

答案 0 :(得分:1)

选项1:在容器启动时

您可以使用包装脚本来创建具有所需继承的环境变量。这是一个简单的包装器脚本

wrapper.sh

ViewTreeObserver.OnGlobalLayoutListener

您的dockerfile需要进行修改以使用它

#!/bin/bash

# prep your environement variables
export command="echo Hello $var_env"

# run your actual command
echo "Hello $command"

选项2:构建期间

您可以通过使用不同的构建参数重建映像来存档。 让您的dockerfile保持几乎相同:

FROM ubuntu
COPY ./wrapper.sh .
ENV var_env=Tarun
ENV command="echo Hello $var_env"
CMD ["sh","-c","./wrapper.sh"]

并运行

FROM ubuntu
ARG var_env=Tarun
ENV command="echo Hello $var_env"
CMD ["sh","-c","echo Hello $var_env"]

这将为您提供dockerfile中定义的默认映像,但是您的 var_env 不再是环境变量。

接下来我们运行

docker build -t test .

这将仅在您定义构建arg的行中使docker缓存无效。因此,请将您的ARG的定义保持在使用位置附近,以最大程度地利用docker build的缓存功能。

您可以在这里找到有关构建参数的更多信息:https://docs.docker.com/engine/reference/commandline/build/