在 Dockerfile 中使用 ARG 和 ENV

Using ARG and ENV in Dockerfile

我正在学习如何在 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

相反,我看到的是空字符串。 我做错了什么?

在 Dockerfile 中,每 FROM 行开始一个新的镜像,并且通常会重置构建环境。如果您的图像需要指定 ARGs,则它们需要在 之后 FROM 行;如果是多阶段构建,则需要根据需要在每个图像中重复它们。在第一个 FROM 之前的 ARG 仅对允许 FROM 行中的变量有用,但不能用于其他情况。

这将在 Dockerfile 文档的 Understand how ARG and FROM interact 下进一步讨论。

FROM centos:7

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

至少因为 20.10.2ARGs 可以从 FROM 行之外传递,你需要做的就是插入另一个 ARG FROM:

之后的名称
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"