如何在Dockerfile中定义变量?

Max*_*ime 121 variables docker dockerfile

在我的Dockerfile中,我想定义稍后可以在Dockerfile中使用的变量.

我知道该ENV指令,但我不希望这些变量成为环境变量.

有没有办法在Dockerfile范围声明变量

小智 87

您可以使用ARG- 请参阅https://docs.docker.com/engine/reference/builder/#arg

ARG指令定义了一个变量,用户可以docker build使用该 --build-arg <varname>=<value>标志在构建时将该变量传递给构建器.如果用户指定了未在Dockerfile中定义的构建参数,则构建会输出错误.

  • @femibyte 它适用于 COPY 命令 (2认同)

Von*_*onC 48

据我所知,只ENV允许,如" 环境更换 "中所述

环境变量(使用ENV语句声明)也可以在某些指令中用作Dockerfile要解释的变量.

它们必须是环境变量,以便在为Dockerfile的每一行创建的每个新容器中重新声明docker build.

换句话说,这些变量不是直接在Dockerfile中解释,而是在为Dockerfile行创建的容器中解释,因此使用环境变量.


这一天,我使用两者ARG(docker 1.10+,和docker build --build-arg var=value)和ENV.单独
使用ARG意味着您的变量在构建时可见,而不是在运行时.

我的Dockerfile通常有:

ARG var
ENV var=${var}
Run Code Online (Sandbox Code Playgroud)

在你的情况下,ARG就足够了:我通常用它来设置http_proxy变量,这个docker build需要在构建时访问互联网.

  • 小心!ARG 变量仅在“使用它的阶段”的范围内,并且需要为每个阶段重新声明!https://docs.docker.com/engine/reference/builder/#scope (8认同)
  • @ChristopherKing 谢谢你的反馈,很好。我已将您的评论和参考包含在答案中,以提高可见度。 (3认同)

Ort*_*kni 33

回答你的问题:

在我的Dockerfile中,我想定义稍后可以在Dockerfile中使用的变量.

您可以使用以下内容定义变量:

ARG myvalue=3
Run Code Online (Sandbox Code Playgroud)

不允许使用相同字符周围的空格.

并在以后使用它

RUN echo $myvalue > /test
Run Code Online (Sandbox Code Playgroud)

  • 总是喜欢用例子回答! (5认同)

Evg*_*kiy 11

如果变量在同一RUN指令中重用,可以简单地设置一个shell变量.我真的很喜欢他们如何使用官方的Ruby Dockerfile来解决这个问题.

  • 很好的答案。虽然您应该尽可能使用 ARG,但有时您需要分配和重用动态变量。示例:`RUN foo=$(date) &amp;&amp; echo $foo` (4认同)

use*_*152 6

您可以使用ARG variable defaultValue并且在运行命令期间您甚至可以使用--build-arg variable=value. 要在 docker 文件中使用这些变量,您可以$variable在运行命令中引用它们。

注意:这些变量可用于 Linux 命令之类的,RUN echo $variable并且它们不会保留在映像中。