Dockerfile小記之ARG和ENV

村望老弟發表於2021-11-28

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了。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
CunWang@Ch

相關文章