上文中我们学习了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
结果如下图所示:
我们可以发现,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
结果如下图所示:
我们可以看到ARG定义的变量并没有出现在容器中。
ARG定义的变量可以动态改变,可以在打包的时候使用--build-arg 参数来改变arg定义变量的内容,如下所示:
docker image build -f /usr/local/docker/Dockerfile.cmd -t testcentos:1.0 --build-arg version=5.0.3 .
运行上方命令,结果如下所示:
如上图所示,命令执行的时候变量的值已经实际5.0.3了。
三:ENV命令和ARG命令的区别
ARG指令在构建镜像时设置环境变量,而ENV指令在运行容器时设置环境变量。
ARG指令是在构建过程中使用的,而ENV指令是在容器运行时使用的。
ARG指令可以通过–build-arg参数传递值,而ENV指令不能。
ARG指令可以将环境变量传递给后续的指令,而ENV指令只能在当前指令中使用。
在构建过程中设置环境变量,可以使用ARG指令;
在容器运行时设置环境变量,可以使用ENV指令。