Docker中latest標簽引發的困惑
本文介紹了Docker中的一個小知識:latest標簽,由于它的字面意思是“最新的”,所以很多時候也容易被誤解,其實latest就是個普通標簽,不要期望它是最新或最穩定的版本。它只是個名字,沒有其它附加作用,更不會自動更新。:)
在Docker中,最容易產生誤解的部分應該是latest這個標簽。困惑主要是由于這個名字造成的,因為字面意思并不能表達它的真正含義。在本文中,我們來學習下latest標簽的真正作用和如何正確使用它。
通常有兩種方式來對鏡像打標簽:使用docker tag命令或者是在執行docker build的時候用-t來傳遞參數。在這兩種情況下,參數的形式通常是repository_name:tag_name,例如:docker tag myrepo:mytag。如果這個資源庫被上傳到了Docker Hub,資源庫的名字會加上一個由Docker Hub用戶名和斜線組成的前綴,例如:amouat/myrepo:mytag。如果沒有添加tag部分的參數,例如:docker tag myrepo:1.0 myrepo,Docker會自動的給它latest標簽。前面這些內容或許你已經熟知,其實它也就這點內容,并沒有什么神奇的地方。
不能因為鏡像的標簽是latest就認為這是資源庫中最新的鏡像。只有這個資源庫的擁有者約定這樣,擁有latest標簽的鏡像才一定是最新的鏡像。例如,我可以輕易地把一個過時的鏡像變成帶有latest標簽的鏡像,例如:
$ docker images myrepo REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE myrepo 1.0 2e9f372f03a0 44 seconds ago 2.433 MB myrepo latest 2e9f372f03a0 44 seconds ago 2.433 MB myrepo 0.9 4986bf8c1536 2 weeks ago 2.433 MB $ docker tag -f myrepo:0.9 myrepo:latest $ docker images myrepo REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE myrepo 1.0 2e9f372f03a0 About a minute ago 2.433 MB myrepo 0.9 4986bf8c1536 2 weeks ago 2.433 MB myrepo latest 4986bf8c1536 2 weeks ago 2.433 MB
這里帶latest標簽的鏡像與0.9版本的鏡像是一樣的,都是兩周前的版本,然而1.0的鏡像是一分鐘以前的。
為什么這個標簽讓很多人迷惑,其實比較容易理解。‘just pull the latest image’ 這句話的意思是獲取帶有latest標簽的鏡像還是獲取最新的鏡像?這兩者是否是一樣呢?它們是不是資源庫中最新的鏡像呢?是不是最新的穩定版鏡像或者是最新的開發版鏡像呢?
更糟糕的是,很多人似乎認為latest標簽會自動更新,也就是說如果我獲取一個帶有latest標簽的鏡像,Docker會在每次運行之前去檢查它是不是最新的版本。這是絕對不會出現的情況,就像其它的標簽一樣,你需要去手工決定Docker獲取最新版本的鏡像。
困惑并不僅僅是這些。如果我從資源庫docker pull一個鏡像卻沒指定標簽,會發生什么呢?如果你認為會獲取下所有的鏡像,那么就錯了,它只會獲取下來帶有latest標簽的那個。如果你需要獲取全部鏡像,需要加上-a標志。 如果你在資源庫執行了pull操作,卻沒帶latest標簽,會發生什么呢?如下所示:
$ docker pull amouat/myrepo Pulling repository amouat/myrepo 2015/01/21 12:04:06 Tag latest not found in repository amouat/myrepo
意料之中的是Docker給出了錯誤信息。但是我認為你不知道這其中發生了什么。
一個更令人討厭的是latest標簽隱藏了其它的標簽,假設你要下載帶latest標簽的debian鏡像。哪個是它的版本呢?
$ docker images debian REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE debian latest 4d6ce913b130 4 days ago 84.98 MB
額,不知道。事實上是7.8 wheezy版本。
$ docker pull debian:7.8 debian:7.8: The image you are pulling has been verified 511136ea3c5a: Already exists d0a18d3b84de: Already exists 4d6ce913b130: Already exists Status: Image is up to date for debian:7.8 $ docker pull debian:wheezy debian:wheezy: The image you are pulling has been verified 511136ea3c5a: Already exists d0a18d3b84de: Already exists 4d6ce913b130: Already exists Status: Image is up to date for debian:wheezy $ docker images debian REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE debian 7.8 4d6ce913b130 4 days ago 84.98 MB debian latest 4d6ce913b130 4 days ago 84.98 MB debian wheezy 4d6ce913b130 4 days ago 84.98 MB
我認為Docker在下載鏡像時應該把所有的標簽都帶上,但是我不知道為什么它沒有這么做。現在的情況是用戶可以擁有同一個鏡像的不同版本因為服務器上用標簽來標示。例如:如果wheezy和latest都在Hub上更新了,而我只獲取了更新后的wheezy版本debian,那么盡管在Hub上他們可以被區分開,但是我的wheezy標簽將會比本地的latest標簽的版本新。
上述只是覆蓋了latest的大部分語義以及它造成的常見誤解。這種情況怎么能夠改善呢?個人認為,可以取消latest標簽并用一個更接近其字面意思的詞來代替,例如default。我也希望可以看到一些改進標簽原作方式的工作,例如同時更新一個鏡像的全部標簽。與此同時,我也強烈建議資源庫管理員去警惕這個latest標簽并徹底廢棄它。
原文鏈接:Docker: The latest Confusion(翻譯:陳杰 審校:李穎杰)
譯者介紹陳杰,北京理工大學計算機學院在讀博士,研究方向是自然語言處理在企業網絡信譽評價方面的應用,平時也樂于去實現一些突發的想法。在疲于配置系統環境時發現了Docker,跟大家一起學習、使用和研究Docker。
來自:http://dockerone.com/article/165
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!