docker(七)dockerfile(三)ENV和ARG命令的基本使用

180 阅读2分钟

上文中我们学习了Dockerfile中FROM命令和RUN命令的基本使用。其实在Dockerfile中我们也是可以将一些重复的标签(比如某个镜像的版本号)定义成变量的。这样直接修改变量的值就可以全局修改了。就方便了许多。

 

Dockerfile中使用ENV与ARG命令来定义变量。

 

一:ENV命令

这里要用到我们之前学习笔记中的一个Dockerfile文件。

FROM centos:7
RUN yum -y install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-7.0.11.tar.gz" \
&& tar -xvf redis.tar.gz

创建一个centos镜像,下载redis安装包,并解压。

 

我们可以看到上方的redis下载版本是7.0.11,我们习惯性的将版本号设置为变量。文件修改如下:

FROM centos:7
ENV version=7.0.11
RUN yum update -y \
    && yum -y install wget \
    && wget -O redis.tar.gz "https://download.redis.io/releases/redis-${version}.tar.gz" \
&& tar -xvf redis.tar.gz

 

执行这个文件,命令如下:

docker image build -f /usr/local/docker/Dockerfile.cmd -t testcentos:1.0 .

这里大概解释一下上方命令中的含义:

-f /usr/local/docker/Dockerfile.cmd :这个表示我们这次执行的Dockerfile文件名称为:Dockerfile.cmd 不加这个参数的情况下,默认执行文件名称为:Dockerfile.

-t testcentos:1.0:这个选项用于指定构建出来的镜像的名称和标签

.:这个点表示 Docker 将会在当前目录下寻找 Dockerfile 文件并执行构建。这个参数不能忘了。忘了会报错

 

接下来我们进入刚刚创建的容器:

docker container run -it testcentos:1.0

在容器中运行命令:

Env

结果如下图所示:

1.jpg

我们可以发现,env定义的变量,在容器中也是可以使用的。

 

二:ARG命令

我们修改一下上方的Dockerfile.cmd文件,代码如下所示:

FROM centos:7
# ENV version=7.0.11
ARG version=7.0.11
RUN yum update -y \
    && yum -y install wget \
    && wget -O redis.tar.gz "https://download.redis.io/releases/redis-${version}.tar.gz" \
&& tar -xvf redis.tar.gz

 

运行命令,创建一个新的镜像:

docker image build -f /usr/local/docker/Dockerfile.cmd -t testarg:1.0 .

 

接下来我们进入刚刚创建的容器:

docker container run -it testarg:1.0

在容器中运行命令:

Env

结果如下图所示:

2.jpg

我们可以看到ARG定义的变量并没有出现在容器中。

 

ARG定义的变量可以动态改变,可以在打包的时候使用--build-arg 参数来改变arg定义变量的内容,如下所示:

docker image build -f /usr/local/docker/Dockerfile.cmd -t testcentos:1.0 --build-arg version=5.0.3 .

运行上方命令,结果如下所示:

3.jpg

如上图所示,命令执行的时候变量的值已经实际5.0.3了。

 

三:ENV命令和ARG命令的区别

ARG指令在构建镜像时设置环境变量,而ENV指令在运行容器时设置环境变量。

ARG指令是在构建过程中使用的,而ENV指令是在容器运行时使用的。

ARG指令可以通过–build-arg参数传递值,而ENV指令不能。

ARG指令可以将环境变量传递给后续的指令,而ENV指令只能在当前指令中使用。

 

在构建过程中设置环境变量,可以使用ARG指令;

在容器运行时设置环境变量,可以使用ENV指令。