在 Dockerfile 中使用 ARG 和 ENV

Tho*_*sch 9 docker dockerfile docker-build

我正在学习如何在 Dockerfiles 中使用 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"
Run Code Online (Sandbox Code Playgroud)

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

并运行它: docker run <resulting-image>

我没有看到预期的输出,这将是

my_value other_default
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*iel 17

至少从 开始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"
Run Code Online (Sandbox Code Playgroud)

  • 正是我正在寻找的 - 谢谢! (2认同)

Dav*_*aze 9

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

这将在Dockerfile 文档中的了解 ARG 和 FROM 如何交互下进一步讨论。

FROM centos:7

# _After_ the FROM line
ARG my_arg
ARG other_arg=other_default
...
Run Code Online (Sandbox Code Playgroud)