Dockerfile小记之ARG和ENV

Docker/容器
481
0
0
2022-07-29
标签   Docker

ARGENV

如何使用?

我们有一个下面这样的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 .

然后准备一份使用ARGdocker 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

image-20211128083505558

那我们再来看看ARGENV有什么不同。

ARGENV的不同点

总的来说ARGENV有两点不同,
  • 第一点是声明变量的作用域不同
  • 第二点是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变量的。

image-20211128084427268

ARG是没有的

image-20211128084517768

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

查看我们镜像中安装的依赖版本

image-20211128090313296

可以看到通过构建指定版本构建成功!然后再通过shell命令,ipinfo verison查看ipinfo的版本,可以看到版本已经变成了2.0.0了。