有些專案環境的 docker 沒有使用 registry 保存 image,即使按照 dockerFile 也不能保證建立的 image 完全一致,或者單純想要備份 image。可以參考以下作法
docker image ls
列出 image,選擇需要保存的 IMAGE ID
或是 REPOSITORY:TAG
組合
docker save -o {image.tar} {IMAGE ID or REPOSITORY:TAG}
將 image 保存為 tar 檔案
如果覺得 tar 檔案太大可以使用 docker save {IMAGE ID or REPOSITORY:TAG} | gzip > {image.tar.gz}
輸出 gzip 壓縮過的 tar 檔案
(可選) 如果 TAG 是 latest
的話,可以使用 docker tag {IMAGE ID} {REPOSITORY:TAG}
指令建立一個容易識別的 TAG 名稱
docker load -i {image.tar}
將 tar 檔案載入為 docker image
啊杯具,連 image 也被砍掉,只剩下 container 怎麼辦?那只好採用 plan B 了
docker container ls
列出 container,選擇需要保存的 CONTAINER ID
或是 NAME
docker export {CONTAINER ID or NAME} > {container.tar}
將 image 保存為 tar 檔案
輸出 gzip 壓縮過的 tar 檔案,指令為 docker export {CONTAINER ID or NAME} | gzip > {container.tar.gz}
docker import {container.tar.gz}
將 container.tar.gz 的內容轉變為 image (不是 container)
需要特別注意的地方是此作法是以 container 產出的檔案建立輕量的 image,沒辦法保存完整的 image 資訊,只能當作下下策。
在一些比較極端的 image 管理策略下,可能會為了減少最終 image 的容量大小而選擇 docker export
的作法,但這樣會犧牲原本的 image 建構歷史紀錄,見仁見智
參考資料: