新聞中心
本文介紹了Docker中的一個(gè)小知識(shí):latest標(biāo)簽,由于它的字面意思是“最新的”,所以很多時(shí)候也容易被誤解,其實(shí)latest就是個(gè)普通標(biāo)簽,不要期望它是最新或最穩(wěn)定的版本。它只是個(gè)名字,沒(méi)有其它附加作用,更不會(huì)自動(dòng)更新。

在Docker中,最容易產(chǎn)生誤解的部分應(yīng)該是latest這個(gè)標(biāo)簽。困惑主要是由于這個(gè)名字造成的,因?yàn)樽置嬉馑疾⒉荒鼙磉_(dá)它的真正含義。在本文中,我們來(lái)學(xué)習(xí)下latest標(biāo)簽的真正作用和如何正確使用它。
通常有兩種方式來(lái)對(duì)鏡像打標(biāo)簽:使用docker tag命令或者是在執(zhí)行docker build的時(shí)候用-t來(lái)傳遞參數(shù)。在這兩種情況下,參數(shù)的形式通常是repository_name:tag_name,例如:docker tag myrepo:mytag。如果這個(gè)資源庫(kù)被上傳到了Docker Hub,資源庫(kù)的名字會(huì)加上一個(gè)由Docker Hub用戶名和斜線組成的前綴,例如:amouat/myrepo:mytag。如果沒(méi)有添加tag部分的參數(shù),例如:docker tag myrepo:1.0 myrepo,Docker會(huì)自動(dòng)的給它latest標(biāo)簽。前面這些內(nèi)容或許你已經(jīng)熟知,其實(shí)它也就這點(diǎn)內(nèi)容,并沒(méi)有什么神奇的地方。
不能因?yàn)殓R像的標(biāo)簽是latest就認(rèn)為這是資源庫(kù)中最新的鏡像。只有這個(gè)資源庫(kù)的擁有者約定這樣,擁有l(wèi)atest標(biāo)簽的鏡像才一定是最新的鏡像。例如,我可以輕易地把一個(gè)過(guò)時(shí)的鏡像變成帶有l(wèi)atest標(biāo)簽的鏡像,例如:
這里帶latest標(biāo)簽的鏡像與0.9版本的鏡像是一樣的,都是兩周前的版本,然而1.0的鏡像是一分鐘以前的。
為什么這個(gè)標(biāo)簽讓很多人迷惑,其實(shí)比較容易理解。‘just pull the latest image’ 這句話的意思是獲取帶有l(wèi)atest標(biāo)簽的鏡像還是獲取最新的鏡像?這兩者是否是一樣呢?它們是不是資源庫(kù)中最新的鏡像呢?是不是最新的穩(wěn)定版鏡像或者是最新的開(kāi)發(fā)版鏡像呢?
更糟糕的是,很多人似乎認(rèn)為latest標(biāo)簽會(huì)自動(dòng)更新,也就是說(shuō)如果我獲取一個(gè)帶有l(wèi)atest標(biāo)簽的鏡像,Docker會(huì)在每次運(yùn)行之前去檢查它是不是最新的版本。這是絕對(duì)不會(huì)出現(xiàn)的情況,就像其它的標(biāo)簽一樣,你需要去手工決定Docker獲取最新版本的鏡像。
困惑并不僅僅是這些。如果我從資源庫(kù)docker pull一個(gè)鏡像卻沒(méi)指定標(biāo)簽,會(huì)發(fā)生什么呢?如果你認(rèn)為會(huì)獲取下所有的鏡像,那么就錯(cuò)了,它只會(huì)獲取下來(lái)帶有l(wèi)atest標(biāo)簽的那個(gè)。如果你需要獲取全部鏡像,需要加上-a標(biāo)志。 如果你在資源庫(kù)執(zhí)行了pull操作,卻沒(méi)帶latest標(biāo)簽,會(huì)發(fā)生什么呢?如下所示:
$ docker pull amouat/myrepo
Pulling repository amouat/myrepo
2015/01/21 12:04:06 Tag latest not found in repository amouat/myrepo
意料之中的是Docker給出了錯(cuò)誤信息。但是我認(rèn)為你不知道這其中發(fā)生了什么。一個(gè)更令人討厭的是latest標(biāo)簽隱藏了其它的標(biāo)簽,假設(shè)你要下載帶latest標(biāo)簽的debian鏡像。哪個(gè)是它的版本呢?
$ docker images debian
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
debian latest 4d6ce913b130 4 days ago 84.98 MB
額,不知道。事實(shí)上是7.8 wheezy版本。
我認(rèn)為Docker在下載鏡像時(shí)應(yīng)該把所有的標(biāo)簽都帶上,但是我不知道為什么它沒(méi)有這么做。現(xiàn)在的情況是用戶可以擁有同一個(gè)鏡像的不同版本因?yàn)榉?wù)器上用標(biāo)簽來(lái)標(biāo)示。例如:如果wheezy和latest都在Hub上更新了,而我只獲取了更新后的wheezy版本debian,那么盡管在Hub上他們可以被區(qū)分開(kāi),但是我的wheezy標(biāo)簽將會(huì)比本地的latest標(biāo)簽的版本新。
上述只是覆蓋了latest的大部分語(yǔ)義以及它造成的常見(jiàn)誤解。這種情況怎么能夠改善呢?個(gè)人認(rèn)為,可以取消latest標(biāo)簽并用一個(gè)更接近其字面意思的詞來(lái)代替,例如default。我也希望可以看到一些改進(jìn)標(biāo)簽原作方式的工作,例如同時(shí)更新一個(gè)鏡像的全部標(biāo)簽。與此同時(shí),我也強(qiáng)烈建議資源庫(kù)管理員去警惕這個(gè)latest標(biāo)簽并徹底廢棄它。
本文名稱:簡(jiǎn)單介紹一下Docker中l(wèi)atest標(biāo)簽
本文鏈接:http://www.5511xx.com/article/cojpgop.html


咨詢
建站咨詢
