尋找帶有標籤和名稱的 docker 映像

尋找帶有標籤和名稱的 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 如何在 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

相關內容