當我執行 docker 映像時,我有下面的docker images
列表,其中有具有多個標籤的映像以及具有最新標籤值的映像。
REPOSITORY TAG IMAGE ID CREATED SIZE
m1 latest 40febdb010b1 15 minutes ago 479MB
m2 130 fab5a122127a 4 weeks ago 2.74GB
m2 115 5a2ee5c5f5e5 4 weeks ago 818MB
m3 111 dd91a7f68e3d 5 weeks ago 818MB
m3 23 0657662756f6 5 weeks ago 2.22GB
m4 23 0657662756f6 5 weeks ago 2.22GB
雖然我這樣做,但for i in {docker image save -o <imagename>.tar}
我只想將映像保存為具有較高數字的標記的 tar,但任何帶有latest
標記和 docker 映像名稱的 docker 映像除外,例如m4
如何在 liner 命令中實現這一點。
答案1
假設使用 bash,這裡有一個「one-liner」可以做到這一點:
unset saved; declare -A saved; docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]]; then continue; fi; if [[ "${saved[$repo]}" != true ]]; then docker image save -o "$repo-$tag".tar "$repo:$tag"; saved["$repo"]=true; fi; done
分開一下就可以理解了:
unset saved
declare -A saved
docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do
if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]]; then continue; fi
if [[ "${saved[$repo]}" != true ]]; then
docker image save -o "$repo-$tag".tar "$repo:$tag"
saved["$repo"]=true
fi
done
這聲明了一個關聯數組saved
,列出僅包含其存儲庫和標籤的圖像,跳過latest
圖像,並保存圖像(如果尚未保存存儲庫)。為了確定後者,當保存影像時,該事實被記錄在數組中saved
;在儲存影像之前,會檢查陣列以查看是否已儲存具有相同儲存庫的影像。
docker images
列出從最新的圖像開始的圖像,因此每當有多個圖像共享相同儲存庫(或名稱)時,這將保存最新的圖像。
沒有對 tarball 名稱進行特殊處理,因此它可能無法完成您對包含斜杠的存儲庫的操作。也無法處理沒有儲存庫或標籤的影像。以下較長版本會根據需要建立子目錄並跳過未標記的映像:
unset saved
declare -A saved
docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do
if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]] || [[ "$repo" == "<none>" ]] || [[ "$tag" == "<none>" ]]; then continue; fi
if [[ "${saved[$repo]}" != true ]]; then
if [[ "${repo}" =~ "/" ]]; then mkdir -p "${repo%/*}"; fi
docker image save -o "$repo-$tag".tar "$repo:$tag"
saved["$repo"]=true
fi
done