构建参数和环境变量
原创大约 1 分钟
ARG
和ENV
是经常容易被混淆的两个Dockerfile
的语法,它们的语法几乎完全一样,都可以用来设置一个变量
,类似于语法占位符。
但实际上它们有很多的不同。
FROM centos
ENV VERSION=7.9
RUN yum update && \
yum install -y wget && \
wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \
tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \
mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \
rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz
FROM centos
ARG VERSION=7.9
RUN yum update && \
yum install -y wget && \
wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \
tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \
mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \
从脚本来看,ARG
和ENV
没有任何区别。但从结构上来看,它们之间的区别如下。

也就是说,ARG
可以在镜像build
的时候动态修改value
,通过--build-arg
参数传递。
> docker build -f Dockerfile-arg -t ipinfo-arg-2.0.0 --build-arg VERSION=2.0.0 .
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ipinfo-arg-2.0.0 latest 0d9c964947e2 6 seconds ago 124MB
进入到镜像中执行。
> docker run -it ipinfo-arg-2.0.0
ipinfo version
2.0.0
总的来说,ARG
和ENV
的区别如下。
ENV
设置的变量通过env
指令查看能够查看到,它在镜像中持久保存,并存在于容器的环境变量里,因此ENV
更多关注容器本身。ARG
设置的变量通过env
指令查看不到,因为它并未保存在不在镜像中,因此ARG
更多关注构建过程。
感谢支持
更多内容,请移步《超级个体》。