容器自己變了:latest 標籤實際上承諾了什麼
什麼都沒更新,容器的行為卻不一樣了。這不是故障:latest 不是版本,而是一個指標。真正的問題不在於拿到最新版,而在於能不能回去。
AtlasPVE ·
本條目涵蓋以下問題
- docker latest tag 為什麼不好
- docker 容器自己更新了
- docker 固定映像檔版本
- docker tag 要怎麼選
- 容器更新後如何回復舊版
什麼都沒有更新。重新啟動容器後,它的行為卻變了:某項設定不見了、介面改變了、某個附加元件停止運作。這不是故障。latest 不是版本,而是一個指標,而它指向什麼,並不由使用者決定。
這個標籤實際上承諾了什麼
latest 並不代表最新的穩定版本。它的意思是發行者最後推送的任何東西。有些發行者在那裡放穩定版本,有些則放開發版建置。單看標籤無法分辨其中的差別。
由此帶來三個後果,而且三個都會在日常中遇到。
同一個檔案,不同的結果。兩台機器可以持有完全相同的設定檔,卻執行不同的版本,因為它們是在不同時間拉取的。在我這裡可以跑的說法,通常就是這樣來的。
變更何時發生,無法自己選擇。容器每次被重新建立時都會更新。某天晚上因為磁碟寫滿而重新啟動它時,可能已在毫無察覺的情況下跳過了一個版本。
壞掉的時候,無法回去。這是最嚴重的一點。不知道自己從哪裡來,就無法回到那裡。最後剩下的只有一句昨天還好好的。
重點不是新版本,而是能夠回去
固定版本並不只是小心謹慎。固定版本創造了一個可以回去的點。在固定版本的架構中,升級是自己做出的決定,而每一個自己做出的決定都可以撤銷。
代價很明白:現在必須自己進行更新。這正是整個用意所在。
標籤可以被移動,指紋不行
標籤可以被發行者移到別的東西上。所以昨天以 1.2 拉取的內容,理論上可能和今天以 1.2 拉取的不同。如果真正想要的是就是這一個,就固定映像檔的指紋而不是標籤。它看起來又長又醜,卻是唯一無法被移動的標記。
對大多數架構來說,固定到版本號就足夠了。指紋適用於多年後必須重現完全相同內容的情況。
誠實的反方論點
固定版本的話,就會錯過安全性修正。沒錯,前提是固定之後就忘了它。固定版本本身不是一種策略,而是一個習慣的一半;另一半是定期閱讀版本說明。固定後就遺忘,比停留在 latest 更糟,因為會逐漸落後,卻不知道自己已經落後。
檢驗方法很簡單:問問自己上一次升級這個容器是什麼時候。答不出來的話,問題不在固定版本,而在行事曆。
Proxmox 這一側的安全網
Docker 容器位於虛擬機器或 LXC 容器之中。這提供了容器世界所沒有的東西:在升級前建立快照。如果升級出了問題,要倒回的不是容器,而是它底下的那台機器。
這不能取代固定版本,但也能涵蓋那些沒有固定的部分。值得養成習慣的順序是:先建立快照,再升級,然後確認它真的能運作。
Atlas 的做法
把設定檔貼進 Atlas 時,它會在執行之前先讀取檔案。沒有固定版本的映像檔,也就是寫著 latest 或完全沒有標籤的映像檔,會被標記為警告。
這刻意是警告,而非阻擋。固定版本是一種偏好,而偏好屬於使用者;產品的工作不是替使用者做決定,而是讓決定變得看得見。真正危險的項目,例如把伺服器自身的控制 socket 交給容器,或掛載伺服器的根目錄,會以不同的顏色和不同的措辭標示。
有一個細節很重要:這項讀取是在伺服器端進行的。所以繞過介面直接傳送檔案,並不會讓警告消失。只存在於畫面上的警告,稱不上警告。
資料來源
Proxmox 官方文件。內容為英文,且在此主題上以官方文件為準。