使用环境变量替换进行Docker环境替换

3
我将尝试在Dockerfile中使用环境变量替换,并结合Docker的环境变量替换,但似乎替换操作是在替换之后进行的。
以下是Dockerfile内容:
FROM alpine:3.7

ENV name="World"
ENV message="Hello, ${name}"

ENTRYPOINT ["env"]

使用Docker运行命令:
$ docker run -it --rm -e "name=Marvin" envtest/helloworld

打印以下环境变量:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=49d702faf257
TERM=xterm
name=Marvin
message=Hello, World
HOME=/root

你可以看到,即使我替换了名称变量,message变量仍然使用来自name的原始值进行替换。
有人知道如何使用docker环境变量替换进行环境变量替换吗? 编辑: 我在Docker论坛中找到评论,指出环境变量在构建时被解释,但可以在运行时逐个替换。因此文档有点误导。

关于您在结尾处的编辑。这与在您的 shell 中完全相同。如果您首先将 name 设置为某些内容,然后使用 $namemessage 设置为某些内容,然后替换 name 的内容,那么不会更改 message 中包含的内容。您需要再次设置 message 才能使用新名称。 - alkanen
1个回答

5
当您构建Dockerfile时,将获得一个映像。而该映像对于Dockerfile中编写的内容一无所知。
这意味着,Docker映像不知道Dockerfile中编写了ENV message="Hello, ${name}"还是ENV message="Hello, world"
它只是按照原样拥有其环境变量,即name="World"message="Hello, world" 因此,当您使用$ docker run -it --rm -e "name=Marvin" envtest/helloworld启动映像时,它会覆盖变量name,即现在nameMarvin
但是message仍然是"Hello, world"
因为在映像内部,message"Hello, world"而不是"Hello, ${name}"

1
是的,我已经知道了,但还是谢谢。我已经将其标记为接受的答案 :) 我的解决方案是将所有替换内容移动到容器内运行的shell脚本中,因为在这种情况下,我只需要它们在这个地方。 - Marvin Richter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接