如何在Dockerfile中定义变量?


155

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

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

有没有一种方法可以在Dockerfile范围内声明变量



@ lumos0815,我认为您应该将其发布为答案(即使这是旧帖子;为了后代),因为这正是OP的要求。
shriek

ARG没有定义可在dockerfile中使用的var。您必须将其与ENV命令配合使用才能获得所需的内容。ARG foo; ENV FOO = $ foo; COPY文件$ foo(对不起,格式不好,我想不可能从电话上执行代码块和多行)
ntwrkguru

Answers:


111

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

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


@MargachChris应该可以将变量用于COPY
lumos0815 '19

对于COPY命令,它似乎不起作用。docs.docker.com/engine/reference/builder/#arg
femibyte '19

54

据我所知,仅ENV允许这样做,如“ 环境替换 ”中所述

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

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

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


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

我的Dockerfile通常具有:

ARG var
ENV var=${var}

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


51

要回答您的问题:

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

您可以使用以下方法定义变量:

ARG myvalue=3

等号周围不能有空格。

稍后将其用于:

RUN echo $myvalue > /test


3

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.