【问题标题】:Dockerfile ENV variable substitution into another ENV variableDockerfile ENV 变量替换为另一个 ENV 变量
【发布时间】:2019-10-21 07:18:52
【问题描述】:

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

这是我的 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 环境变量的值,它也会更新command 环境变量中的var_env 环境变量的值。

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

【问题讨论】:

  • 这就是我所期望的 - 您在环境变量中设置了一个 ,而不是某种函数。
  • 如果答案解决了您的问题,请接受它或提供其他信息以进一步调试手头的问题。如果您已经找到解决方案,请将其发布并接受以与社区分享

标签: docker dockerfile


【解决方案1】:

选项 1:在容器启动时

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

包装器.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 build 的缓存功能。

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

【讨论】:

  • 克莱门斯,这行得通。但是,我不能将“var_env”的值作为--build-arg 传递。因为我需要在运行时传递这个值,以便我可以在不同的环境中运行我的图像。出于演示目的,我编写了 var_env=Tarun。在 docker 运行时传递时,我将覆盖它,它将具有 dev、qa 等值,并且适当地,我需要更新“命令”环境变量。
  • Tarun,那么您将需要采用“硬”方式并编写一个包装脚本,该脚本在启动时根据您的层次结构设置您的环境,因为您所描述的这种层次结构不适用于环境Linux下的变量(不仅仅是docker)。如果你喜欢我可以为你创建一个示例包装器。
  • Clemens,在尝试了您的第一个选项后,我能够更新“command”变量,并且可以在包装脚本中执行我的命令。但是,如果我执行到容器中并执行“echo $command”,我仍然会得到“echo Hello Tarun”而不是“echo Hello New Env Value”。是否也可以解决这个问题?
  • 你为什么需要它?从您的包装脚本中,您还将启动您的应用程序。因此,您的应用程序将有权访问包装脚本中设置的环境变量。这不是你需要的吗?
  • 正确的 Clemens,你的方法对我很有帮助。但是,我在问是否有办法让“命令”变量随处更新。
猜你喜欢
  • 2017-03-13
  • 2021-05-19
  • 2021-08-27
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多