ドッカー画像を実行すると、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として保存したいと思います。latest
m4
答え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