在我的 Dockerfile 中,我想定义稍后可以在 Dockerfile 中使用的变量。
我知道
ENV
指令,但我不希望这些变量成为环境变量。
有没有办法在 Dockerfile 范围内声明变量?
您可以使用
ARG
- 请参阅https://docs.docker.com/engine/reference/builder/#arg
指令定义了一个用户可以传递的变量 使用ARG
命令对构建器进行构建时间docker build
旗帜。如果用户指定构建 如果 Dockerfile 中未定义参数,则构建会输出一个 错误。--build-arg <varname>=<value>
在构建期间与 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> .
回答你的问题:
在我的 Dockerfile 中,我想定义稍后可以在 Dockerfile 中使用的变量。
您可以使用以下方式定义变量:
ARG myvalue=3
等号两边不允许有空格。
稍后使用它:
RUN echo "$myvalue" > /test
据我所知,只有
ENV
允许,如“环境更换”中提到的
环境变量(使用
语句声明)也可以在某些指令中用作由 Dockerfile 解释的变量。ENV
它们必须是环境变量,以便在
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构建需要在构建时访问互联网。
小心!
变量仅在“使用它的阶段”的范围内,并且需要为每个阶段重新声明。ARG
变量定义从 Dockerfile 中定义它的行生效,而不是从命令行或其他地方使用参数开始生效。ARG
例如,考虑这个 Dockerfile:
FROM busybox USER ${user:-some_user} ARG user USER $user # ...
用户通过调用来构建此文件:
docker build --build-arg user=what_user .
第 2 行中的
的计算结果为USER
,因为用户变量是在后续第 3 行中定义的。some_user
当定义用户并且在命令行上传递值时,第 4 行的USER
计算为what_user
。what_user
在由指令定义之前,对变量的任何使用都会导致空字符串。ARG
指令在定义它的构建阶段结束时超出范围。ARG
要在多个阶段使用 arg,每个阶段必须包含指令。ARG
您可以使用
ARG variable defaultValue
,并且在运行命令期间您甚至可以使用 --build-arg variable=value
更新此值。要在 docker 文件中使用这些变量,您可以在运行命令中将它们引用为 $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
,因为我不想将此令牌暴露给其他任何东西