如何在Dockerfile中定义一个变量?

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

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

是否有一种在Dockerfile范围内声明变量的方法?

265128 次浏览

据我所知,只有ENV允许这样做,正如“;环境替代"

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

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

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


今天,我同时使用了ARG (docker 1.10+和docker build --build-arg var=value)和ENV
单独使用ARG意味着你的变量在构建时可见,在运行时可见

我的Dockerfile通常有:

ARG var
ENV var=${var}

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


克里斯托弗•王的评论中添加:

< p >小心!
ARG变量只在它被使用的“阶段”的范围内。并且需要为每个阶段重新声明

他指出Dockerfile / scope

ARG变量定义从Dockerfile中定义它的行生效,而不是从参数在命令行或其他地方的使用中生效。

例如,考虑这个Dockerfile:

FROM busybox
USER ${user:-some_user}
ARG user
USER $user
# ...

用户通过调用:

docker build --build-arg user=what_user .

第2行中的USER计算为some_user,因为用户变量在随后的第3行中定义。
第4行中的USER在定义user时计算为what_user,并且what_user值在命令行上传递。
ARG指令定义变量之前,任何变量的使用都会导致空字符串 ARG指令在构建阶段结束时超出了定义它的范围。
若要在多个阶段中使用arg,每个阶段必须包含ARG指令

如果变量在同一个RUN指令中被重用,可以简单地设置一个shell变量。我真的很喜欢他们如何处理这个官方Ruby Dockerfile

你可以使用ARG -参见https://docs.docker.com/engine/reference/builder/#arg

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

可以在构建时使用COPY(例如,复制标签特定的内容,如特定的文件夹) 例如:< / p >

ARG MODEL_TO_COPY
COPY application ./application
COPY $MODEL_TO_COPY ./application/$MODEL_TO_COPY

在构建容器时:

docker build --build-arg MODEL_TO_COPY=model_name -t <container>:<model_name specific tag> .

回答你的问题:

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

你可以用以下方法定义变量:

ARG myvalue=3

等号周围不允许有空格。

然后用在:

RUN echo $myvalue > /test

你可以使用ARG variable defaultValue,在run命令中,你甚至可以使用--build-arg variable=value更新这个值。要在docker文件中使用这些变量,你可以在run命令中将它们引用为$variable

这些变量可以用于像RUN echo $variable这样的Linux命令,并且它们不会持久化在映像中。

虽然有点晚了,但如果你不想暴露环境变量,我想这样做会更容易:

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,因为我不想将这个令牌暴露给其他任何东西