ラベルと名前を含むドッカー画像を探す

ラベルと名前を含むドッカー画像を探す

ドッカー画像を実行すると、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

これを実行している間は、1つのライナーコマンドでこれを達成する方法に示されているように、タグとドッカーイメージ名を持つドッカーイメージを除いて、画像をよりfor i in {docker image save -o <imagename>.tar}多くのタグ付きtarとして保存したいと思います。latestm4

答え1

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

関連情報