如何在Dockerfile中定义变量?

时间:2015-11-26 10:10:07

标签: variables docker dockerfile

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

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

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

6 个答案:

答案 0 :(得分:74)

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

  

ARG指令定义了用户可以传递的变量   使用docker build命令构建构建器的时间   --build-arg <varname>=<value>标志。如果用户指定了构建   在Dockerfile中没有定义的参数,构建输出一个   错误。

答案 1 :(得分:42)

据我所知,只有ENV允许这样做,如“Environment replacement”中所述

  

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

它们必须是环境变量才能在docker build为每个Dockerfile行创建的每个新容器中重新声明。

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

今天,我同时使用ARGdocker 1.10+, and docker build --build-arg var=value)和ENV 单独使用ARG表示您的变量在构建时可见,不在运行时

我的Dockerfile通常有:

ARG var
ENV var=${var}

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

答案 2 :(得分:13)

回答您的问题:

  

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

您可以通过以下方式定义变量:

ARG myvalue=3

在等号周围不允许有空格。

并在以后与

一起使用
RUN echo $myvalue > /test

答案 3 :(得分:10)

如果变量在同一RUN指令中重用,可以简单地设置一个shell变量。我真的很喜欢他们用official Ruby Dockerfile接近这个。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

晚了聚会,但是如果您不想公开环境变量,我想这样做会更容易:

RUN echo 1 > /tmp/__var_1
RUN echo `cat /tmp/__var_1`
RUN rm -f /tmp/__var_1

我最终这样做是因为我们在AWS Codeartifact中托管了私有npm软件包:

RUN aws codeartifact get-authorization-token --output text > /tmp/codeartifact.token
RUN npm config set //company-123456.d.codeartifact.us-east-2.amazonaws.com/npm/internal/:_authToken=`cat /tmp/codeartifact.token`
RUN rm -f /tmp/codeartifact.token

这里ARG无法工作,我不想使用ENV,因为我不想将此令牌暴露给其他任何东西