在Dockerfile中使用ARG和ENV

22

我正在学习如何在Dockerfile中使用ARG和ENV。

我有这个简单的Dockerfile:

ARG my_arg
ARG other_arg=other_default

FROM centos:7

ENV MY_ENV $my_arg
ENV OTHER_ENV $other_arg

CMD echo "$MY_ENV $OTHER_ENV"

当我构建它时: docker build --build-arg my_arg=my_value

然后运行它: docker run <resulting-image>

我看不到预期的输出,这应该是:

my_value other_default

相反,我看到一个空字符串。我做错了什么吗?

2个回答

26
在 Dockerfile 中,每个 FROM 行都会启动一个新的镜像,并通常重置构建环境。如果您的镜像需要指定 ARG,则它们需要在 FROM 行之后指定;如果它是一个多阶段构建,则需要在每个镜像中根据需要重复指定。在第一个 FROM 之前的 ARG 只能用于允许在 FROM 行中使用变量,否则无法使用。

有关详细信息,请参见 Dockerfile 文档中的 理解 ARG 和 FROM 的交互方式

FROM centos:7

# _After_ the FROM line
ARG my_arg
ARG other_arg=other_default
...

1
基本上,我被“ARG是Dockerfile中唯一可以在FROM之前出现的指令”这句话搞糊涂了,简单地理解为你想出于风格原因将ARG放在FROM之前,但我没有点击链接。 - Thomas Hirsch
当您在命令行上使用“--build-arg”选项传递ARG时,那么当Docker遇到“FROM”时,它们会被清除吗? - MiloDC
1
你需要同时声明一个 ARG 并传递 --build-arg 选项。如果你已经在需要的地方声明了 ARG,那么每个使用都应该从命令行获取相同的值。 - David Maze

16

从至少20.10.2版本开始,可以从FROM行之外传递ARG,您只需要在FROM之后插入另一个具有相同名称的ARG即可:

ARG my_arg
ARG other_arg=other_default

FROM centos:7

# These need to be re-stated here to use the ARGs above.
ARG my_arg
ARG other_arg # This will be populated with the default value 'other_default'.

ENV MY_ENV $my_arg
ENV OTHER_ENV $other_arg

CMD echo "$MY_ENV $OTHER_ENV"

1
正是我所需要的 - 谢谢! - Carlo Nyte

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