Shell-Script
查找帶有標籤和名稱的 docker 圖像
當我執行 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
如何在一個線性命令中實現這一點。
假設 bash,這裡有一個“單線”可以做到這一點:
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