在我的 Dockerfile 中,我想定义变量我可以稍后在Dockerfile中使用。
我知道ENV
指令,但我不希望这些变量成为环境变量。
有没有办法在Dockerfile范围内声明变量?
答案 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行创建的容器中解释,因此使用环境变量。
今天,我同时使用ARG
(docker 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
,因为我不想将此令牌暴露给其他任何东西