ARG
和ENV
如何使用?
我们有一个下面这样的dockerfile
FROM ubuntu:latest
RUN apt-get update && \
apt-get install -y wget && \
wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz && \
tar zxf ipinfo_2.0.1_linux_amd64.tar.gz && \
mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo && \
rm -rf ipinfo_2.0.1_linux_amd64.tar.gz
这段文件里有ipinfo的版本是ipinfo-2.0.1
,这个版本是有可能改变的。文件里一共出现了5次2.0.1
,修改起来已经比较麻烦了,如果出现更多次,几乎变的不可维护。所以这时候就需要定义一个变量,方便日后的维护。
先用ENV
的形式来修改变量(有个小坑需要给大家说一下,就是注意在写变量时,值不要有任何的空格,否则在打包时会失败。)
dockerfile.ENV
FROM ubuntu:latest
ENV VERSION=2.0.1
RUN apt-get update && \
apt-get 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
这样写之后,如果以后版本改变了,我们只要修改一处,就可以完成所有的修改了。
我们现在来构建一下这个ENV的镜像。
docker image build -t <Image tag> -f dockerfile.ENV .
然后准备一份使用ARG
的docker file
dockerfile.ARG
FROM ubuntu:latest
ARG VERSION=2.0.1
RUN apt-get update && \
apt-get 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
同样使用 docker image build -t <Image tag> -f dockerfile.ARG .
去构建
两个打包完成后,用docker image ls
查看一下两个镜像,可以看到两个镜像的大小是一样的。都是121M
。
那我们再来看看ARG
和ENV
有什么不同。
ARG
和ENV
的不同点
总的来说ARG
和ENV
有两点不同,
- 第一点是声明变量的作用域不同
- 第二点是ARG声明后,可以在构建时修改变量。
1. ENV可带到镜像中
我们通过交互模式的命令启动镜像并且进入到 EVN
构建的env-test
镜像中
docker container run -it -p 3000:3000 env-test sh
或者
docker container run -it -p 3000:3000 env-test /bin/bash
然后通过env
命令查看,可以看到里边是会有VERSION
变量的。
而ARG
是没有的
2.ARG可以在构建镜像时改变变量值
在构建时,可以使用—build-arg
参数来更改变量的值,比如现在要把变量VERSION的值进行修改,就可以使用下面的命令。
docker image build -f dockerfile.ARG -t test-arg-2.0.0 --build-arg VERSION=2.0.0 .
镜像构建完成后,使用可交互命令进入
docker container run -it -p 3000:3000 test-arg-2.0.0 /bin/bash
查看我们镜像中安装的依赖版本
可以看到通过构建指定版本构建成功!然后再通过shell
命令,ipinfo verison
查看ipinfo的版本,可以看到版本已经变成了2.0.0了。