如何在 Dockerfile 中定义变量?

问题描述 投票:0回答:6

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

我知道

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

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

variables docker dockerfile
6个回答
239
投票

您可以使用

ARG
- 请参阅https://docs.docker.com/engine/reference/builder/#arg

ARG
指令定义了一个用户可以传递的变量 使用
docker build
命令对构建器进行构建时间
--build-arg <varname>=<value>
旗帜。如果用户指定构建 如果 Dockerfile 中未定义参数,则构建会输出一个 错误。

在构建期间与 COPY 配合使用(例如复制特定文件夹等标签特定内容) 例如:

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> .

194
投票

回答你的问题:

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

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

ARG myvalue=3

等号两边不允许有空格。

稍后使用它:

RUN echo "$myvalue" > /test

95
投票

据我所知,只有

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构建需要在构建时访问互联网。


Christopher King添加了评论

小心!

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 行中定义的。
当定义用户并且在命令行上传递
USER
值时,第 4 行的
what_user
计算为
what_user

在由
ARG
指令定义之前,对变量的任何使用都会导致空字符串。

ARG
指令在定义它的构建阶段结束时超出范围。
要在多个阶段使用 arg,每个阶段必须包含
ARG
指令。


18
投票

如果在同一条

RUN
指令中重复使用该变量,则可以简单地设置一个 shell 变量。我真的很喜欢他们使用官方 Ruby Dockerfile 来解决这个问题。


11
投票

您可以使用

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

注意: 这些变量可用于

RUN echo $variable
等 Linux 命令,并且它们不会保留在图像中。


3
投票

聚会迟到了,但如果你不想暴露环境变量,我想这样做会更容易:

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

© www.soinside.com 2019 - 2024. All rights reserved.