Shell-Script

查找帶有標籤和名稱的 docker 圖像

  • October 27, 2021

當我執行 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

引用自:https://unix.stackexchange.com/questions/674928