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



我正在学习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:在容器启动时

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

wrapper.sh

#!/bin/bash
# prep your environement variables
export command="echo Hello $var_env"
# run your actual command
echo "Hello $command"

您的 dockerfile 需要适应才能使用它

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

选项 2:在构建期间

可以通过使用不同的生成参数重新生成映像来存档此内容。 让我们保持你的 dockerfile 几乎相同:

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

并运行

docker build -t test .

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

接下来我们运行

docker build -t test --build-arg var_env="New Env Value" .

这将仅使已定义构建参数的行中的 docker 缓存失效。因此,请将 ARG 的定义保持在靠近其使用位置的位置,以便最大化 docker 构建的缓存功能。

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

最新更新