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了。
本作品採用《CC 協議》,轉載必須註明作者和本文連結